ZJU-java Advanced Notes Неделя 4 (Наследование и полиморфизм)

  1. Наследование - одна из важных характеристик объектно-ориентированных языков. Языки без наследования могут называться только "объектно-ориентированными языками".

  2. Подкласс наследует все члены от родительского класса
    ① За исключением конструктора, в конце концов, конструктор имеет то же имя, что и родительский класс
    ② Получение его не означает, что вы можете использовать его случайно
    Вставьте описание изображения сюда

  3. Если мы попытаемся переопределить переменную-член, которая уже существует в родительском классе, то мы определяем переменную, которая полностью не связана с переменной-членом родительского класса. В дочернем классе мы можем получить доступ к переменной, определенной в дочернем классе (родительский Класс скрыт), обратитесь к родительскому классу в методе родительского класса. Хотя у них одно и то же имя, они не влияют друг на друга .

  4. Конструктор родительского класса будет вызываться перед конструктором подкласса

  5. Первое предложение super () конструктора слова class указывает, какой конструктор родительского класса вызывается в соответствии с параметрами

  6. При создании объекта подкласса вы должны сначала убедиться, что переменные-члены, принадлежащие родительскому классу, правильно инициализированы.
    Относится к: определить инициализацию и конструктор

  7. Конструктор, у которого не только есть this.title = title

  8. Невозможно изменить переменные-члены родительского класса с частных на защищенные.
    Пример: подкласс Zhongyuan.

System.out.println("DVD:"+title+":"+director);

Теперь изменено на

System.out.print("DVD:");
super.print();
System.out.print(director);

Присоединяйтесь к родительскому классу

public void print(){
    
    
    System.out.print(title+" ");
}

Таким образом, нет необходимости изменять заголовок члена родительского класса с частного на защищенный.

  1. Все переменные, которые содержат типы объектов в Java, являются полиморфными переменными. Термин «полиморфизм» (буквально означает множество форм) относится к переменной, которая может содержать объекты разных типов (то есть ее объявленный тип или любой подтип).
Car myCar = new Car();

То есть объект подкласса может использоваться в качестве объекта родительского класса, включая:
① Переменная, назначенная родительскому классу (происходит восходящее моделирование )
(моделирование заключается в присвоении одного типа объекта другому типу переменной)
восходящее моделирование Не нужно ставить круглые скобки впереди, в скобках ставить тип, это всегда безопасно

② Перейти к функции, которой нужен родительский объект

③ Поместите его в контейнер, в котором хранится родительский объект

public void list(){
    
    
   for(Item item:listItem){
    
    
      item.print();
   }
}

Подумайте, что каждая переменная имеет два типа: статический и динамический.
Виден статический. Например, здесь тип элемента.
Динамический - это тип объекта, который программа запускает здесь и фактически управляет.

11. Если объект родительского класса хочет быть назначен объекту подкласса, Только на
примере моделирования 1

Vechicle v;
Car c = new Car();
v = c;//可以
c = v;//编译报错
c = (Car) v;//向下造型,当且仅当v这个变量实际管理的是Car类型

Пример 2 (Примечание: Item - родительский класс класса CD)

Item item = new Item("行路易知难", 0, "优秀公众号");
CD cd = new CD("深夜书店","许嵩",2, 10, "超好听");
item = cd;(item的动态类型变成cd了,静态未变)
CD cd2 = (CD)item;
  1. Назначение объектов объектам в Java фактически позволяет двум менеджерам управлять общим объектом (это имеет место в языках ООП)
String s = “hi”
s = “bye”

Вместо того, чтобы заменять hi на bye, просто содержимое, управляемое s, изменилось, первоначально указывая на hi, а теперь указывая на bye

  1. Стандартное определение модельного литья
    Вставьте описание изображения сюда

Что такое преобразование типов

int i = (int)10.2

Стиль просто рассматривает вас как другой тип, но не превращает вас в другой тип.

Укладка вверх всегда безопасна

  1. Динамическая привязка Java по умолчанию.
    Привязка: когда объектная переменная вызывает функцию, решите, какую из них вызвать.
    Статическая привязка: определите, какая
    динамическая привязка будет привязана в соответствии с типом объявления переменной (статическим): определите привязку в соответствии с динамическим типом переменной Какая из
    них вызывает другие функции-члены в функции-члене, поскольку ее можно выразить как this ..., ее также можно рассматривать как динамическую привязку.
    Например, функция print () родительского класса Item выглядит следующим образом
    public void print(){
    
    
        System.out.print(title+" ");
}

И на выходе

CD:深夜书店 许嵩(title是”深夜书店”)

Это потому, что функция print () подкласса CD выглядит следующим образом

    public void print() {
    
    
        System.out.print("CD:");
        super.print();
        System.out.print(artist);
}

item.print (); фактически вызывается print () подкласса

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

  2. Все классы в Java, объявленные или нет, являются подклассами Object (почти все языки ООП реализуют такую ​​однокорневую структуру, кроме C ++)

Класс Object предоставляет функцию
toString () [возвращает строковое представление объекта] [перегружено генерацией]
equals () [сравнивает, являются ли два объекта одинаковыми]
...
как получить
Object o = new Object ();
o. ...

пример

CD cd = new CD("奇妙能力歌","陈粒",1, 5, "好听");
CD cd1 = new CD("奇妙能力歌","陈粒",1, 5, "好听");
System.out.println(cd.equals(cd1));

Выход

false

Причина: теперь у класса CD нет собственного equals (), он использует Object, чтобы определить, управляют ли два менеджера одним и тем же объектом.
Решение: используйте generate, чтобы перегрузить equals на CD, то есть добавить следующий код

    @Override
    public boolean equals(Object obj) {
    
    
        CD cc = (CD)obj;//向下造型
        return artist.equals(cc.artist);
}

Новый вывод

true

Примечание: см. @Override, подпись (имя функции и параметры) функции подкласса и родительского класса должны быть одинаковыми.

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

отblog.csdn.net/weixin_44997802/article/details/108515120