一、什么是继承
把相同的属性和行为抽离出来放到父类,再让子类使用extends关键字继承父类后,就可以直接使用父类公共的属性和方法了,提高了代码的复用性可以降低重复代码的书写。
子类既有自己类的属性和行为,也有父类的属性和行为。
二、继承的注意事项
- 只能单继承,一个子类只能有一个父类,不能有多个父类。
- 可以多层继承,子类的父类也可以有父类(子类的爷爷类)。
- 子类可以继承“祖宗类”的成员变量和成员方法(爷爷类、爷爷类的父类....等)。
- 私有成员变量也可以继承,但是不能直接访问,可以间接访问。
- 构造方法不能继承,但是子类可以调用父类的构造方法,父类的构造方法不能用于创建子类对象。
- 在子类方法中访问成员遵循就近原则:先找子类,再找父类,父类找不到就报错。
- 子类重写父类方法时,私有方法不能被重写。
三、继承注意事项的理解
对于第3点,子类可以继承父类、“爷爷类”、“爷爷类的父类......”的成员变量和成员方法。说通俗点,子类可以继承“祖宗类”所有的成员变量和成员方法。
对于第4点,私有成员变量是用private修饰的,所以它的访问范围只在本类中,所以子类当然不能直接访问,但是可以通过public修饰的set、get方法间接访问到私有成员变量。
代码演示:
Boy继承了Man
Man中有私有成员变量name,以及用public修饰的set、get方法。
Test1类中创建Boy对象,并用Boy对象访问成员变量name,发现编译报错:name has private access in ...... MAN。
但是可以通过public修饰的set、get方法间接访问到私有成员变量。
对于第5点
子类不能继承父类的构造方法,只能调用父类的构造方法。
子类的无参构造和有参构造都是默认会调用父类的无参构造,要想子类的有参构造调用父类的有参构造,加上super(参数1,参数2),就会调用父类的有参构造,就不再调用父类的无参构造。
如果父类中不存在无参构造器,也不存在有参构造器,是不会报错的,因为类会默认存在一个无参构造器。
如果父类不存在无参构造器,但是存在有参构造器,就会报错。因为子类的无参构造和有参构造都是默认会调用父类的无参构造,此时类也不会默认存在一个无参构造器,所以会报错。
演示一:父类中只存在有参构造会报错,因为子类的无参构造、有参构造默认会调用父类的无参构造。
父类中只存在有参构造
子类就会报错
演示二:如果子类中只存在有参构造,不存在无参构造,就不能使用子类的无参构造创建子类的对象。因为构造方法,都是用类名()、类名(参数1、参数2)这样的,子类和父类的名字不一样,所以构造方法不能继承,就不能使用父类的无参构造创建子类的对象。
子类Boy中只存在有参构造
父类中无参构造、有参构造都有
此时无法创建子类的无参构造对象
演示三:子类的无参构造和有参构造都是默认会调用父类的无参构造。
子类中创建有参构造器和无参构造器:
父类中创建有参构造器和无参构造器:
Test1中使用无参构造创建子类对象
发现首先调用了父类的无参构造,再调用子类的无参构造。
Test1中使用有参构造创建子类对象
同样发现首先调用了父类的无参构造,再调用子类的有参构造。
子类的有参构造器中加上super(参数);
再在Test1中使用有参构造创建子类对象,发现首先调用了父类的有参构造,再调用子类的有参构造,此时不再调用父类的无参构造。
继承中构造方法总结:
1、构造方法不能继承,但是子类可以调用父类的构造方法,父类的构造方法不能用于创建子类对象。
2、子类的无参构造和有参构造都是默认会调用父类的无参构造。
3、要想子类的有参构造调用父类的有参构造,加上super(参数1,参数2),就会调用父类的有参构造,就不再调用父类的无参构造。
4、如果父类中不存在无参构造器,也不存在有参构造器,是不会报错的,因为类会默认存在一个无参构造器。
5、如果父类不存在无参构造器,但是存在有参构造器,就会报错。因为子类的无参构造和有参构造都是默认会调用父类的无参构造,此时类也不会默认存在一个无参构造器,所以会报错。
6、this();super();只能存在于构造方法的第一行,所以不能同时存在。
四、Idea中查看继承关系
4.1 Idea中查看子类的所有父类
这样就能很直观的展示一个类所有的父类
4.2 Idea中查看父类的所有子类
4.3 Idea中展示父类的所有子类
展示子类的所有父类
这种方式和4.1的效果一样,但是没有4.1更加直观!
参考网址:
IntelliJ IDEA 中如何查看一个类的所有继承关系,包括父类与子类 | 骐晔