ПРЕДИСЛОВИЕ: (вы можете просто пропустить этот раздел до Введения XD )
Хорошо, Java и cpp – это языки, которые я изучаю в своей школе, хотя этим летом я получаю электронное письмо от своего профессора о том, что нам “лучше” иметь некоторый опыт работы на C. (И я использую несколько недель, чтобы ознакомиться с этим. БОЖЕ МОЙ)
И мы знаем, что эти два языка являются Объектно-ориентированное программирование Языки. Таким образом, у них есть три функции, которые отличаются от процедурно-ориентированного языка (например, C, который я изучил до сих пор).
В связи с тем, что эти три функции имеют высокую частоту встречаемости на собеседованиях многих компаний, я решаю обобщить свои знания.
Этот блог основан на языке JAVA, и вы должны знать, что между всеми языками ООП все еще существуют различия. И в этом блоге я постараюсь использовать “мое слово” и свое мышление, чтобы описать, что они собой представляют и почему они существуют, как их использовать. Пожалуйста, поправьте меня, если в моем блоге есть что-то неправильное. Спасибо!
Вступление
- Инкапсуляция
- Наследование
- Полиморфизм
Инкапсуляция: Что, Почему Как
1. Определение (Что):
Поместите объекты, которые имеют одинаковые характеристики или принадлежат к одному классу, вместе и хорошо упакуйте их.
Итак, вы знаете, что в компании есть множество отделов, которыми руководят разные менеджеры или руководители. Например, у нас есть It_департамент
класс и Отдел кадров
класс.
class HR_Department{ private String Manager; private String[] Dep_Members; HR_Department(String manager_name){// constructor of HR_Dep Manager = manager_name; } private void employ(){ System.out.println("Our company need to employ a new employee."); } private void dismissal(){ System.out.println("We decide to dismissal someone..."); } } class IT_Department{ private String Manager; private String[] Dep_Members; IT_Department(String manager_name){// constructor of IT_Dep Manager = manager_name; } private void Access_Database(){ System.out.println("Our IT Department can access database of our company."); } private void Power_outage(){ System.out.println("IT Department decide to shut down the power for fixing problems."); } } class Google_Inc{ private IT_Department it_Dep; private HR_Department hr_Dep; Google_Inc(String IT_Manager_Name,String HR_Manager_Name){// constructor of Google_Inc it_Dep = new IT_Department(IT_Manager_Name); hr_Dep = new HR_Department(HR_Manager_Name); System.out.println("Google Inc is established successfully!"); } } public class Test { public static void main(String[] args) { // set up a company call newGoogle_Inc XD Google_Inc google_Inc = new Google_Inc("Jack", "Rose"); } }
Если вы являетесь генеральным директором этой компании, вам придется нанять несколько менеджеров, которые помогут вам управлять этими различными отделами, и, конечно, вам нужно, чтобы все отделы работали в идеальном порядке и помогали друг другу.
2. Значение (Почему):
Вы можете легко представить, насколько запутанным был бы этот сценарий, если бы у нас не было доступа ко всем данным в любом классе.
Я полагаю, вы терпеть не можете, когда сотрудник отдела кадров отключает питание, не связавшись с ИТ-отделом. (даже я никогда не работаю ни в одной компании XD) Это опасно и выходит за рамки дозволенного в любом месте.
Таким образом, существование инкапсуляции показывает ее важность прямо сейчас. Пример компании также подходит для управления любой программой, кодом, данными. Это опасно, когда после того, как вы создадите программу, некоторые из ваших пользователей смогут получить доступ к вашим данным и отредактировать их.
Поэтому для Java мы обычно хорошо “упаковываем” наш КЛАСС (данные) с помощью модификатора разрешений . 1. публичный
2. защищен
(по умолчанию) 3. частный
(чаще всего используется для изменения класса и переменной, как вы можете видеть в предыдущем блоке кода)
Очевидно, вы можете понять, что, если вы правильно используете модификатор разрешений, вы можете реализовать преимущества вашего кода:
1.Изолируйте важные переменные (переменные) или функции (функции). 2.Удобный доступ к переменным или функциям 3.Повышение важности 4.Повышение безопасность
И, конечно же, эти преимущества также приводят к тому, что доступ к коду становится намного сложнее, и вы тратите больше шагов на доступ к ним.
3. Реализация инкапсуляции (КАК):
Прежде чем использовать их, вам необходимо знать диапазон различных модифицированных вирусов или грибков, к которым можно получить доступ.
частный | Да | |||
по умолчанию | Да | Да | Да | |
защищенный | Да | Да | Да | |
общественный | Да | Да | Да | Да |
В некотором роде, защищенный равно значению по умолчанию.
Например: Вы не можете получить доступ к имени менеджера отдела кадров напрямую, назначив =
:
Итак, вам нужно настроить некоторые функции, называемые “Добытчиками” и “Сеттерами”.:
class IT_Department{ private String Manager; private String[] Dep_Members; IT_Department(String manager_name){// constructor of IT_Dep Manager = manager_name; } String getManager(){ // a classic getter function //return manager's name return Manager; } void setManager(String name){// a classic setter function //set name to manager's name this.Manager = name; } private void Access_Database(){ System.out.println("Our IT Department can access database of our company."); } private void Power_outage(){ System.out.println("IT Department decide to shut down the power for fixing problems."); } }
Следовательно, вы можете понять, что реализация инкапсуляции является абстрактной в коде. Мы предпочитаем называть инкапсуляцию явлением или особенностью. Если у вас есть четкие и строгие рамки кода, ваши коды будут выглядеть так ХОРОШО и УДОБНО.
В основной функции:
public static void main(String[] args) { // set up a company call newGoogle_Inc Google_Inc google_Inc = new Google_Inc("Jack", "Rose"); String name = google_Inc.it_Dep.getManager(); // assign "Jack" to name. google_Inc.it_Dep.setManager("Ben");// assign "Ben" to IT Department's manager }
Наследование: W W H
1. Определение (Что): Ключевое слово: расширять
Когда несколько классов имеют общие атрибуты (переменные-члены) и поведение (методы-члены), эти общие части извлекаются и определяются в общедоступном классе. Другие классы и классы могут формировать отношения наследования с этим общедоступным классом, так что нет необходимости переопределять общедоступную часть в нескольких классах! Этот общий класс является родительским классом, также известным как суперкласс или базовый класс, а остальные классы являются подклассами. Подклассы могут напрямую обращаться к непубличным переменным-членам родительского класса, а к закрытым переменным-членам родительского класса можно получить доступ с помощью метода super.get().
Теперь у нас есть коды на следующем:
class Father{ String car = "Toyota"; String books = "Harry Potter"; } class Son extends Father{ // son extends from his father } public class Test { public static void main(String[] args) { Father Howard_Stark = new Father(); Son Tony_Stack = new Son(); System.out.println(Tony_Stack.car); } }
Похоже, у сына ничего нет. Однако, как только зона простирается от его отца, Тони теперь будет водить машину от своего отца и читать книги, которые его отец “передает” ему.
public class Test { public static void main(String[] args) { Father Howard_Stark = new Father(); Son Tony_Stack = new Son(); System.out.println(Tony_Stack.car); // output: Toyota System.out.println(Tony_Stack.books);// output: Harry Potter } }
Некоторые особенности, на которые вам следует обратить внимание при наследовании в Java:
Каждый подкласс мощнее базового класса, что означает, что подкласс будет иметь или охватывать больше переменных и функций, чем класс-отец. (Конечно, Железный человек Тони намного больше, чем его отец Говард, ха-ха)
Эвенсон унаследовал черты своего отца, сын не смог “изменить” черты своего отца. Причина, по которой sony не смогла изменить функцию своего отца, заключается в том, что отец и сын являются двумя независимыми экземплярами
класса Сын
икласса Отец
.
public class Test { public static void main(String[] args) { Father Howard_Stark = new Father(); Son Tony_Stack = new Son(); Tony_Stack.car = "Mercedes";//Tony changes his car to Mercedes, but could not change Howard's car. System.out.println(Howard_Stark.car); // output: Toyota System.out.println(Tony_Stack.car); // output: Mercedes } }
Следовательно, то, что у Тони есть в будущем, не касается Говарда, включая его Отметку Один и Отметку Два. Вот почему класс сыновей абсолютно превосходит класс отцов.
class Father{ String car = "Toyota"; String books = "Harry Potter"; } class Son extends Father{ // son extends from his father String suit1 = "Mark One"; String suit2 = "Mark Two"; }
- Java – это одиночное наследование, а не множественное наследование (в отличие от C++). Однако можно создавать многоуровневые подклассы наследования.
Подобно тому, как Тони происходит от Говарда, Морган Старк (дочь Тони) происходит от Тони, но Морган не мог одновременно происходить от Говарда и Тони.
Тони_старк <-(расширяется)– Говард_Старк Морган_Старк <-(расширяется)– Тони_старк
Морган_Старк <–X– Говард_Старк, Тони_старк
2. Значение (Почему):
- Если класс хочет получить ту же функцию от другого класса, он может настроить наследование. (Сэкономьте свое время на кодировании и увеличьте частоту повторного использования кода)
2.Инкапсуляция и наследование являются необходимыми условиями для реализации полиморфизма.
Конечно, когда вы редактируете функцию класса отца, общие функции, которыми обладает сын, также будут изменены, если только сын не изменит эти общие функции самостоятельно.
3. Реализация (Каким образом):
Это лучшее время для реализации наследования между классами:
- Когда эти классы имеют много общих свойств.
- Когда между этими классами явно существует взаимосвязь (например,
класс животные
включаеткласс собака
икласс кошка
, поэтомукласс кошка
икласс собака
расширяют свойства изкласса животные
).
Узнав, когда использовать наследование, вы можете попытаться выстроить отношения и составить приблизительное представление о них.
Я собираюсь поговорить о шести моментах наследования.
1.При создании экземпляра подкласса компилятор сначала вызовет конструктор базового класса, а затем вызовет конструктор подкласса.
class Father{ String car = "Toyota"; String books = "Harry Potter"; Father(){ System.out.println("Father's constructor invoked"); } } class Son extends Father{ // son extends from his father String suit1 = "Mark One"; String suit2 = "Mark Two"; Son(){ System.out.println("Son's constructor invoked"); } } public class Test { public static void main(String[] args) { Son Tony_Stack = new Son(); } }
Выход:
Конструктор отца вызван Конструктор сына вызван
2. объект класса
является классом-отцом любого класса в JAVA.
Следовательно, каждый экземпляр (объект) в Java является полиморфизмом экземпляра класса Object
.
3.Конструктор подкласса сначала запускает функцию super (), независимо от того, есть ли у него аргументы или сколько их;
super();
равно конструктору класса отца по умолчанию. Таким образом, вы можете явно или неявно вызвать super()
в любом конструкторе подкласса.
class Father{ String car = "Toyota"; String books = "Harry Potter"; // where the super() is. Father(){ System.out.println("Father's constructor invoked"); } Father(String car){ this.car = car; } } class Son extends Father{ // son extends from his father Son(){ //super(); default System.out.println("Son's constructor invoked"); } Son(String book){ //super(); default this.books = book; } }
4.Свойства, которые являются частными для родительского класса, недоступны напрямую для подкласса в test.java , даже если подкласс наследует их.
Вы можете указать конструктор параметров подклассов, только вызвав конструктор параметров родительского класса. Для свойств, которые не являются частными для родительского класса, объект дочернего класса может вызываться напрямую.
class Father{ String car = "Toyota"; String books = "Harry Potter"; private String bank_account = "123456"; Father(){ System.out.println("Father's constructor invoked"); } Father(String car){ this.car = car; } } class Son extends Father{ // son extends from his father Son(){ //super(); default System.out.println("Son's constructor invoked"); } } public class Test { public static void main(String[] args) { Son Tony_Stack = new Son(); Tony_Stack.bank_account = "111111";// error reported: 'bank_account' has private access in 'test.Father'!!! } }
В связи с ограниченностью параграфа, здесь представлены все мои знания о наследовании, и в разделе полиморфизма будет больше подробностей о функциях.
Полиморфизм:
Наконец, я начинаю писать о разделе ПОЛИМОРФИЗМА. В этом разделе мне нужно гораздо больше ознакомиться с основными знаниями Трех основных функций Java .
Наследование, возможно, не самая популярная в коде, но самая важная часть программирования (по крайней мере, я так думаю XD).
1. Что такое полиморфизм:
Полиморфизм – это реализация объекта, имеющего различные проявления.
Например, при нажатии одной и той же кнопки “ВВОД” в разных приложениях компьютер будет отображать разные реакции, например, функцию “Перевод строки” в приложении Word, функцию “Отправить” после ввода текста в окне чата и т.д. Точно так же, как вызов одной и той же функции, нажатие кнопки “ВВОД” играет разные роли в разных приложениях. Это тоже своего рода полиморфизм.
2. Значение полиморфизма:
- Удалить связь между классами
- Возможность замены
- Масштабируемость
- Работает как интерфейс (как настоящий
интерфейс
в Java) - Гибкость
- Простота
Прежде чем описать все его значение, есть три необходимых условия существования полиморфизмов, которые вы должны знать:
- Реализация наследования: Как вы можете видеть, реализация полиморфизма – это также реализация
- Переопределение
- Ссылка на класс отца указывает на объект подкласса:
Родительский потомок();
Теперь у нас есть занятия по нашей программе:
И у нас есть коды для этих:
class Shape { void draw() {}// is overridden } class Circle extends Shape { void draw() {//override function draw() of class Shape System.out.println("Circle.draw()"); } } class Square extends Shape { void draw() {//override function draw() of class Shape System.out.println("Square.draw()"); } } class Triangle extends Shape { void draw() {//override function draw() of class Shape System.out.println("Triangle.draw()"); } }
Когда метод вызывается в полиморфном режиме, сначала проверяется, существует ли метод в родительском классе. Если этого не произойдет, произойдет ошибка компиляции. Если это так, вызовите метод с тем же именем в подклассе. Явление вызова функции в подклассе с тем же именем, что и у родительского класса, но показывающей разные результаты, называется переопределением.
Лучший способ продемонстрировать эти 6 преимуществ – взглянуть на следующий код:
abstract class Animal {// Abstraction abstract void eat(); } class Cat extends Animal { public void eat() {// Interface System.out.println("Eat fish."); } public void work() { System.out.println("Catch mouse."); } } class Dog extends Animal { public void eat() { System.out.println("Eat bone."); } public void work() { System.out.println("Guard."); } } public class Test { public static void main(String[] args) { show(new Cat()); // Invoke the show() through the object of class Cat show(new Dog()); // Invoke the show() through the object of class Cat Animal a = new Cat(); // Upcasting a.eat(); // Invoke eat() of class Cat Cat c = (Cat)a; // Downcasting c.work(); // Invoke work() of class Cat } public static void show(Animal a) { a.eat(); // Judging the class type if (a instanceof Cat) { // What a cat does Cat c = (Cat)a; c.work(); } else if (a instanceof Dog) { // What a dog does Dog c = (Dog)a; c.work(); } } }
И вы можете увидеть результат:
Ешь рыбу. Лови мышку. Ешь кость. Охрана. Ешь рыбу. Лови мышку.
3. Как реализовать полиморфизм:
- Переопределение:
Переопределение существует для полиморфизмов.
Мы уже обсуждали переопределения методов, которые являются методами, которые могут быть переопределены подклассом.
Когда объект подкласса вызывает переопределенный метод, вызывается метод в подклассе, а не переопределенный метод в суперклассе.
Для вызова переопределенного метода в родительском классе необходимо использовать ключевое слово super
.
- Интерфейс
Интерфейсы в Java похожи на интерфейсы в жизни, которые представляют собой наборы характеристик методов, но не реализацию методов. Подробности см. в разделе Интерфейсы Java .
- Абстрактные классы и абстрактные функции (виртуальная функция)
Виртуальные функции также существуют для полиморфизмов.
Конечно, реализация полиморфизма связана не только с взаимодействием между классами. Это также может быть реализовано с помощью абстрактной функции()
и абстрактный класс {}
(как виртуальная функция() в c++).
Последнее, но не менее
Эти понятия абстрактные
и переопределение
может быть написано в других блогах. Тем не менее, этот блог – мой первый блог, я надеюсь, что смогу получить некоторые отзывы и советы от наших членов сообщества разработчиков, а затем снова двигаться вперед.
Ваши советы и комментарии – это сила моего продвижения вперед. Спасибо вам за ваше чтение.
Никогда не знаешь, насколько ты будешь хорош, если не будешь давить на себя. Рики Райан:
Электронная почта: yruan@umass.edu
Оригинал: “https://dev.to/devide_r_conquer/3-main-characteristics-of-java-oop-language-class-2237”