ZJU-java进阶笔记 第四周(继承与多态)

  1. 继承是面向对象语言的重要特征之一,没有继承的语言只能被称作“使用对象的语言”。

  2. 子类从父类那里继承来了所有的成员
    ① 除了构造函数,毕竟构造函数和父类同名
    ② 得到不等于可以随便使用
    在这里插入图片描述

  3. 如果我们试图重新定义一个在父类中已经存在的成员变量,那么我们是在定义一个与父类的成员变量完全无关的变量,在子类中我们可以访问这个定义在子类中的变量(父类的被隐藏起来了),在父类的方法中访问父类的那个。尽管它们同名但是互不影响

  4. 在调用子类的构造函数前会先调用父类的构造函数

  5. 字类的构造函数的第一句 super()表示根据参数去调用父类哪一个构造器

  6. 构造一个子类的对象时,首先要确保父类拥有的成员变量得到恰当的初始化
    指的是:定义初始化和构造器

  7. 构造器里面不是只能有this.title = title这类

  8. 把父类的成员变量由private改成protected是没办法的办法
    例:子类中原

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

现改成

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

在父类中加入

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

这样就不需要把父类成员title由private改成protected

扫描二维码关注公众号,回复: 11857450 查看本文章
  1. Java中所有保存对象类型的变量是多态变量。“多态”这个术语(字面意思是许多形态)是指一个变量可以保存不同类型(即其声明的类型或任何子类型)的对象。
Car myCar = new Car();

即子类的对象可以被当作父类的对象使用,具体包括:
① 赋值给父类的变量(发生了向上造型)
(造型是把一个类型的对象,赋给另一个类型的变量)
向上造型是不需要前面加括号,括号里面放类型,是永远安全的

② 传递给需要父类对象的函数

③ 放进存放父类对象的容器里

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

认为每个变量都有静态和动态两种类型
静态是看到的,如这里的Item类型
动态是程序运行到这里,实际管理的的对象类型

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里面对象给对象赋值其实是让两个管理者管理一个共同的对象(OOP语言都这样)
String s = “hi”
s = “bye”

不是用bye替换hi,只是s管理的内容变了,原先指向hi,现在指向bye

  1. 造型cast的标准定义
    在这里插入图片描述

什么是类型转换

int i = (int)10.2

造型只是把你当作另外一个类型看待,并没有把你改造成另外一个类型

向上造型总是安全的

  1. Java默认动态绑定
    绑定:对象变量调用函数的时候,决定调用哪一个这件事
    静态绑定:根据变量的声明(静态)类型决定绑定哪个
    动态绑定:根据变量的动态类型决定绑定哪个
    在一个成员函数中调用其他成员函数,由于可以表示为this.……,也可认为是动态绑定
    例如父类Item的print()函数如下
    public void print(){
    
    
        System.out.print(title+" ");
}

而输出却为

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

这是因为子类CD的print()函数如下

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

item.print();实际调用了子类的print()

  1. 覆盖:子类和父类中存在名称和参数完全相同的函数,这一对函数构成覆盖关系。
    通过父类的变量调用存在覆盖关系的函数时,会调用变量当时所管理的对象所属的类的函数

  2. Java当中所有的类,不管声不声明,都是Object的子类(几乎所有OOP语言都实现了这样的单根结构,除了C++)

Object类提供了函数
toString()【返回一个对象的字符串表达形式】【可通过generate重载】
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的,用来判断两个管理者管理的是否是同一个对象
解决方案:在CD中使用generate重载equals,即加入如下代码

    @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