一、封装

上一节Java三大特性之封装介绍了面向对象的封装性,接下来介绍面向对象的继承、多态两大特性。

二、继承

1.什么是继承?
猫和狗都属于动物,他们都具有动物的特性,我们可以说猫和狗都继承自动物。Java中继承就是子类继承父类的特征和行为,可以使用父类的所有属性和方法的同时也可以有自己特有的属性和方法。
2.如何使用继承?
使用extends关键字

class A extends B{ }

java双重继承 java有多重继承的特点吗_父类


3.继承有什么好处?

提高代码的复用性,减少冗余代码

4.Java关于继承的规定

① 只允许单继承

② 多个类可以继承自一个父类

③ 允许多重继承

④ Object是所有类的父类

5.重写(overide)

子类继承父类以后,对父类中定义的相同的方法名、参数列表、返回值类型相同的方法重写方法体,以实现不同于父类的功能,这种方式被称为方法重写/覆盖。

java双重继承 java有多重继承的特点吗_java双重继承_02

重写相关说明:
① 子类方法的访问权限要比父类的访问权限大
② 父类中的private修饰的方法子类无法重写
③ 子类和父类中的同名同参数的方法要么都声明为非static的(可以重写),要么都声明为static(此时就不再是重写)

6.super关键字

当子类继承了父类之后,子类对象就无法使用父类的成员和被重写的方法,为了解决这个问题,引入super关键字。

(1)super调用父类的成员变量和成员方法

java双重继承 java有多重继承的特点吗_java_03


(2)super(参数列表)调用父类的构造方法

java双重继承 java有多重继承的特点吗_后端_04

注意

java双重继承 java有多重继承的特点吗_父类_05

在子类的构造方法中一定会调用父类的某个构造方法,这时可以在子类的构造方法中使用super(参数列表)指定调用的父类构造方法,若不指定时会默认调用父类无参的构造方法,若没有,就会报以上的错误。
因此,在定义一个类时,在定义了有参的构造方法后,可以再定义一个无参的构造方法,避免子类继承后调用时出错。

三、多态

1.什么是多态?

多态的理解与应用 多态体现为父类引用指向子类对象。

2.如何使用多态?

语法:父类类型 变量名=new 子类类型();

虚拟方法调用

(1)多态成员方法:编译看左边,运行看右边。

当调用子父类同名同参数的方法时,实际调用的是子类重写的方法。

(2)多态成员变量:编译运行看左边

java双重继承 java有多重继承的特点吗_父类_06


3.多态有什么好处?

消除了类之间的耦合性,提高了程序的可扩展性和可维护性

4.Java多态的体现

类的继承、方法重写、父类引用指向子类

5.对象的类型转换

向上转型(多态):父类引用指向子类对象,语法: 父类 父类对象 = 子类实例, 自动;

如:Peron p = new Student();

java双重继承 java有多重继承的特点吗_java双重继承_07


在实现多态以后,由于父类的对象声明为父类的类型,导致子类所特有的属性和方法无法使用,此时就需要对象的类型转换—>向下转型,此时就可以调用子类所特有的属性和方法。向下转型:父类对象强制转变为子类对象,语法: 子类 子类对象 = (子类)父类实例,强制。

如:Student s = (Student) p;

java双重继承 java有多重继承的特点吗_后端_08


6.instanceof关键字

在向下转型时,我们需要判断一个对象是否为某个类(或接口)的实例或子类实例,如果是,返回true,否则返回false。

语法: 对象(或者对象引用变量) instanceof 类(或接口)

java双重继承 java有多重继承的特点吗_开发语言_09


注意:如果a instanceof A返回true,则a instanceof B也返回true。其中,类B是类A的父类。

java双重继承 java有多重继承的特点吗_开发语言_10

扩展面试题:

1.方法重写和重载的区别?

① 重写的方法参数列表必须相同;而重载的方法参数列表或参数个数必须不同,与方法返回值类型无关。
② 重写是对有继承关系的父类中的方法重写,重载是同一个类中同名的方法。
③ 重写的方法的返回值类型只能是父类类型或者父类类型的子类,而重载的方法对返回值类型没有要求。

2.谈谈你对多态的理解?

Java多态是指父类引用指向子类对象,不同类(继承自同一个父类,可以是object或其他父类)的对象在调用同一个方法时所呈现的不同行为。
如:
① Dog类和Cat类都继承自Animal类,都对Animal类进行了重写,此时两个类的对象在调用shout()方法时,Cat结果是“喵喵”,而Dog结果是“汪汪”。
② 抽象类和接口的实现
③ 编程时连接数据库后对数据库的操作。

3.多态是编译时行为还是运行时行为?

答:是运行时行为,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的。

思考:

1.为什么this(形参列表)和super(形参列表)调用语句不能在同一个构造器中出现?

答:this(形参列表)和super(形参列表)只能在构造器中作为第一条语句。

2.为什么this(形参列表)和super(形参列表)调用语句只能在构造器 第一句出现?

答:无论通过哪个构造器创建子类对象,需要保证先初始化父类。
目的:当子类继承父类后,"继承"父类中所有的属性和方法,因此子类有必要知道父类如何为对象进行初始化。