[Путь к тому, чтобы стать королем Java] Глава 14: Java SE (объектно-ориентированное программирование — композиция, полиморфизм)

Цели этого раздела

комбинация

полиморфизм

1. Что такое комбинация

Подобно наследованию, композиция также является способом выражения отношений между классами, а также позволяет достичь эффекта повторного использования кода, например, для представления школы:

public class Student { 
 ... 
} 
public class Teacher { 
 ... 
} 
public class School { 
 public Student[] students; 
 public Teacher[] teachers; 
} 

Композиция не включает в себя специальный синтаксис (ключевые слова, такие как extends), она просто принимает экземпляр одного класса как поле другого класса.Это один из распространенных способов, которыми мы проектируем классы.

Комбинаторное представление имеет - семантика

В предыдущем примере мы можем понять, что школа «содержит» несколько учеников и учителей.

Наследование представляет собой семантику

В приведенном выше примере «животные и собаки» мы можем понять, что собака также «является» животным.

Во-вторых, что такое полиморфизм

Полиморфизм: буквальное понимание: одна вещь имеет много форм (это предложение нельзя говорить интервьюеру) 

Преобразование вверх: 

Преобразование: одно предложение, ссылка на родительский класс, ссылка на объект подкласса

class Animal{
    public String name;
    public int age;

    public void eat(){
        System.out.println("eat()");
    }

    public Animal(String name,int age){
        this.name = name;
        this.age = age;
    }
}
class Dag extends Animal {
    public Dag(String name,int age){
        super(name,age);
    }


}
class Bird extends Animal{

    public String wing;

    public void fly(){
        System.out.println(age+"fly");

    }

    public Bird(String name,int age,String wing){
        super(name,age);
        this.wing = wing;
    }

}
public class TestDemo{
    public static void main(String[] args) {
        //Dag dag = new Dag("HAHAH",12);
        //Animal animal = dag;
        Animal animal1 = new Dag("HAHAH",12);
    }

Что происходит, когда происходит повышение:

1. Прямое назначение

2. Передача параметров метода

3. Метод возвращает

Мы продемонстрировали метод прямого присваивания, два других метода существенно не отличаются от прямого присваивания.

Параметры метода:

 В настоящее время типом формального параметра является Animal (базовый класс), который фактически соответствует экземпляру Dag (родительский класс).

 метод возвращает:

Динамическая привязка:

Динамическая привязка:

Два помещения:

1, ссылка на родительский класс, ссылка на объект подкласса

2. Через эту ссылку на родительский класс вызовите метод переопределения с тем же именем родительского класса и дочернего класса.

Одноименный метод переопределения, термин: переопределение

Переписать:

1: имя метода такое же

2: список параметров такой же (номер + тип)

3: возвращаемое значение одинаково

Переопределение должно быть в случае родительских и дочерних классов

Динамическое связывание — основа полиморфизма


// Animal.java 
public class Animal { 
 protected String name; 
 public Animal(String name) { 
 this.name = name; 
 } 
 public void eat(String food) { 
 System.out.println("我是一只小动物"); 
 System.out.println(this.name + "正在吃" + food); 
 } 
} 
// Bird.java 
public class Bird extends Animal { 
 public Bird(String name) { 
 super(name); 
 } 
 public void eat(String food) { 
 System.out.println("我是一只小鸟"); 
 System.out.println(this.name + "正在吃" + food); 
 } 
} 
// Test.java 
public class Test { 
 public static void main(String[] args) { 
 Animal animal1 = new Animal("圆圆"); 
 animal1.eat("谷子"); 
 Animal animal2 = new Bird("扁扁"); 
 animal2.eat("谷子"); 
 } 
} 
// 执行结果
我是一只小动物
圆圆正在吃谷子
我是一只小鸟
扁扁正在吃谷子

На данный момент мы обнаружили:

Хотя и животное1, и животное2 являются ссылками на тип Животное, животное1 указывает на экземпляр типа Животное, а животное2 указывает на экземпляр типа Птица.

Вызовите метод eat для животных1 и животных2 соответственно и обнаружите, что animal1.eat() фактически вызывает метод родительского класса, а animal2.eat() фактически вызывает метод подкласса.

Поэтому в Java, когда вызывается метод класса, какой кусок кода выполняется (это код метода родительского класса или код метода подкласса), зависит от того, указывает ли ссылка на родительский класс объект или объект подкласса.Этот процесс определяется во время выполнения программы (а не во время компиляции), поэтому он называется динамической привязкой

Меры предосторожности:

1. Метод не может быть статичным

2. Модификатор доступа подкласса должен быть больше или равен модификатору доступа родительского класса.

3. Приватный метод нельзя переопределить

4. Метод, измененный final, не может быть переопределен.

Кроме того, для переопределенных методов вы можете использовать аннотацию @Override, чтобы явно указать

// Bird.java 
public class Bird extends Animal { 
 @Override 
 private void eat(String food) { 
 ... 
 } 
} 

Наличие этой аннотации может помочь нам выполнить некоторые проверки законности.Например, если имя метода написано с ошибкой (например, aet), то компилятор обнаружит, что в родительском классе нет метода aet, и скомпилирует ошибку, сообщая Cannot представляют собой переопределение. Мы рекомендуем явно добавлять аннотацию @Override при переопределении методов в коде.

Суммировать:

Давайте сначала кратко разберемся с концепцией полиморфизма, а затем углубимся в понимание и понимание полиморфизма с помощью кода, чтобы каждый мог полностью понять грамматические знания полиморфизма.

 

рекомендация

отblog.csdn.net/m0_64397675/article/details/123616315
рекомендация