文章目录
- 一、继承
- 1.继承的例子(is-a)
- 2.组合的例子(has-a)
- 二、多态
- 1.重写
- 2.重载
- 三、继承的语法
- 四、继承的注意事项
- 1.初始化的顺序:
- 2.super关键字
- 五、继承访问限定符
- 六、多态实现方式
- 七、多态的理解
- 注意事项:
一、继承
同c++,继承的思想一脉相承,是为了给现实世界中有is-a关系的事物之间实现代码复用的一种思想。
还有一种关系:has-a。
1.继承的例子(is-a)
比如:猫和狗都是动物,猫和狗就可以继承自动物。
2.组合的例子(has-a)
眼睛和鼻子都属于头,眼睛和鼻子就可以组合成为头。
二、多态
多态是一种事物的多种状态,是一种事物在不同对象上表示出的不同状态的现象。
多态在c++中实现必须使用(纯)虚函数+指针/引用,在Java中需要使用重写。
1.重写
重写和重载相近,但是重写要求更加严苛:
1、函数名相同
2、参数列表相同
3、返回值相同
由上,重写就是在子类中有一个和父类一模一样的函数,只不过是函数体不一样,也正是因为此,才能够使得一个东西在不同对象身上展示出不一样的状态。
2.重载
重载就是将同一个函数名的函数,根据参数列表的不同(顺序、个数、类型),实现为不同的函数,那么这两个同名函数就构成重载。
值得注意的是:不以返回值不同而构成重载
三、继承的语法
使用extends关键字。
四、继承的注意事项
1.初始化的顺序:
先父类,后子类。
在此基础上还有一个原则是先静态代码块,再实例代码块,再构造代码块。(创建多个子类对象时,静态代码块只执行一次)
class Father {
static {
System.out.println("父类静态代码块");
}
{
System.out.println("父类实例代码块");
}
public Father() {
System.out.println("父类构造函数");
}
}
class Son extends Father{
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类实例代码块");
}
public Son() {
System.out.println("子类构造函数");
}
}
public class Main {
public static void main(String[] args) {
Father father = new Son();
}
}
执行结果:
2.super关键字
1)访问父类成员时需要使用super关键字。
2)当在子类中实现带参父类初始化需要显式调用super完成子类中父类成员的初始化。
必须第一行写super、不能与this同时出现
但是this和super可以同时访问父类对象:
this可访问的成员是当前整个对象的,但是super更专精些,只能访问到当前对象继承父类的那一部分成员。
五、继承访问限定符
private | default | protected | public | |
---|---|---|---|---|
同包同类 | √ | √ | √ | √ |
同包不同类 | √ | √ | √ | |
不同包的子类 | √ | √ | ||
不同包非子类 | √ |
其中包是用来更好管理类的东西(将功能相近的类放在同一个包中)
六、多态实现方式
多态实现方式必须有:
1.继承
2.子类和父类中构成重写(函数名相同、参数列表相同、返回值相同)
3.通过父类引用来调用重写的方法(切片)
可以使用override进行标注重写
若不满足重写,则不构成多态:
七、多态的理解
当同一个方法(构成重写),对于同一个父类类型,但是让他指向不同的子类(发生向上转型),会发生不同的调用,这就是多态。
注意事项:
尽量不要在构造函数中使用实例方法,因为会触发动态绑定,从而发生不愿意看到的结果
- 子类中的重写方法:
在构造方法中尽量使用final或者是private方法:
private: