Java中的继承总结
1、继承(extends)的概述
面向对象的三大特征:封装,继承,多态。
继承是Java中一般到特殊的关系,是一种子类到父类的关系。
例如:学生类继承了人类。 猫类继承了动物类。
被继承的类称为:父类/超类。
继承父类的类称为:子类。
继承的作用?
“可以提高代码的复用”,相同代码可以定义在父类中。
然后子类直接继承父类,就可以直接使用父类的这些代码了。
(相同代码重复利用)
子类更强大:子类不仅得到了父类的功能,它还有自己的功能。
继承的特点:
子类继承了一个父类,子类就可以直接得到父类的属性(成员变量)和行为(方法)了。
继承的格式:
子类 extends 父类{
}
小结:
- 继承是子类到到父类的一种关系。
- 子类继承了一个父类,子类就可以直接得到父类的属性和行为了。
- 在Java中继承是 “is a” 的关系。Cat extends Animal:猫是一个动物。
- 在Java中,子类是更强大的,子类不仅继承了父类的功能,自己还可以定义自己的功能。
2、继承的使用案例
案例(教务系统)
学生类(姓名,年龄,吃饭,特有功能:学习)
老师类(姓名,年龄,吃饭,特有功能:授课)
班主任(姓名,年龄,吃饭,特有功能:管理)
问题:
如果直接定义类会出现大量相同属性相同行为的重复代码。
企业开发中不允许太多冗余代码。
解决思路:
把相同的属性和行为定义在一个父类中,然后让子类继承即可。
父类:People类(姓名,年龄,吃饭)
学生类(特有功能:学习)
老师类(特有功能:授课)
班主任(特有功能:管理)
小结:
- 继承的优势可以把相同的代码定义在父类中,子类可以直接继承使用。
- 这样就可以提高代码的复用性:相同代码只需要在父类中写一次就可以了。
3、子类不能继承父类的内容
引入:
子类继承父类,子类就得到了父类的属性和行为。
但是并非所有父类的属性和行为等子类都可以继承。
子类不能继承父类的东西:
- 子类不能继承父类的构造器:子类有自己的构造器。(没有争议的)
- 有争议的观点(拓展):
- 子类是否可以继承父类的私有成员(私有成员变量,私有成员方法)?
- 我认为子类是可以继承父类的私有成员的,只是不能直接访问而已。
- 以后可以暴力去访问继承自父类的私有成员~~~
- 子类是否可以继承父类的静态成员?
- 我认为子类是不能继承父类的静态成员的,
- 子类只是可以访问父类的静态成员,父类的静态成员只有一份可以被子类共享访问。共享并非继承。
- 子类是否可以继承父类的私有成员(私有成员变量,私有成员方法)?
4、继承后-成员变量的访问特点
就近原则:
子类有找子类,子类没有找父类,父类没有就报错。
小结:
- this代表了当前对象的引用,可以用于访问当前子类对象的成员变量。
- super代表了父类对象的引用,可以用于访问父类中的成员变量。
5、继承后成员变量的访问特点
继承后成员变量的访问特点:就近原则
子类有找子类,子类没有找父类,父类没有就报错!
如果一定要申明访问父类的成员变量可以使用:super.父类成员变量。
-- super指父类引用。
小结:
- 子类访问成员变量的原则:就近原则。
- 如果一定要访问父类的成员变量可以使用super关键字。
6、继承后-成员方法的访问特点
就近原则:
子类有找子类,子类没有找父类,父类没有就报错。
小结:
- 子类对象优先使用子类已有的方法。
7、方法重写
方法重写的概念:
子类继承了父类,子类就得到了父类的某个方法
但是子类觉得父类的这个方法不好用或者无法满足自己的需求
子类重写一个与父类申明一样的方法来覆盖父类的该方法,子类的这个方法
就进行了方法重写。
方法重写的校验注解: @Override
Java建议在重写的方法上面加上一个@Override注解。
方法一旦加了这个注解,那就必须是成功重写父类的方法,否则报错!
注: @Override优势:可读性好,安全,优雅!!
方法重写的具体要求:
- 子类重写方法的名称和形参列表必须与父类被重写方法一样。
- 子类重写方法的返回值类型申明要么与父类一样,要么比父类方法返回值类型范围更小。(以后再了解)
- 子类重写方法的修饰符权限应该与父类被重写方法的修饰符权限相同或者更大。(以后再了解)
- 子类重写方法申明抛出的异常应该与父类被重写方法申明抛出的异常一样或者范围更小!(以后再了解)
方法重写的规范:
- 加上@Override注解。
- 建议“申明不变,重新实现”。
小结:
- 方法重写是子类重写一个与父类申明一样的方法覆盖父类的方法。
- 方法重写建议加上@Override注解。
- 方法重写的核心要求:方法名称形参列表必须与被重写方法一致!!
- 建议“申明不变,重新实现”。
8、继承后-构造器的特点
特点:
子类的全部构造器默认一定会先访问父类的无参数构造器,再执行子类自己的构造器。
为什么子类构造器会先调用父类构造器?
- 子类的构造器的第一行默认有一个super()调用父类的无参数构造器,写不写都存在!
- 子类继承父类,子类就得到了父类的属性和行为。
- 当我们调用子类构造器初始化子类对象数据的时候,必须先调用父类构造器初始化继承自父类的属性和行为啊。
9、继承后构造器的特点
继承后子类构造器的特点:
调用子类构造器的时候,子类的构造器一定会先调用父类的无参数构造器再执行自己的构造器。
为什么子类构造器一定要先调用父类无参数构造器:
- 子类的全部构造器的第一行默认有一个super()调用父类无参数构造器。
- 调用子类构造器初始化子类对象的时候,必须先调用父类构造器去初始化继承自父类的成员。
小结:
- 子类构造器默认一定会先调用父类的无参数构造器再执行自己。
9、super调用父类构造器
特点:
子类的全部构造器默认一定会调用父类的无参数构造器。
super(...):可以根据参数选择调用父类的某个构造器。
小结:
- 可以在子类构造器中通过super(...)根据参数选择调用父类的构造器,以便调用
- 父类构造器初始化继承自父类的数据。
10、继承后super调用父类构造器。
子类构造器的第一行可以写一个:super(...)调用父类的指定构造器
小结:
- 子类构造器可以通过super(...)根据参数去调用父类构造器以便初始化继承自父类的成员变量数据!!
this和super关键字使用总结
this代表了当前对象的引用(继承中指代子类对象):
- this.子类成员变量。
- this.子类成员方法。
- this(...):可以根据参数匹配访问本类其他构造器。(还没有学习)
super代表了父类对象的引用(继承中指代了父类对象空间)
- super.父类成员变量。
- super.父类的成员方法。
- super(...):可以根据参数匹配访问父类的构造器。
拓展:this(...)根据参数匹配访问本类其他构造器。
注意:
- this(...)借用本类其他构造器。
- super(...)调用父类的构造器。
- this(...)和super(...)必须放在构造器的第一行,否则报错!
- 所以this(...)和super(...)不能同时出现在构造器中!!!
继承的特点;
1.单继承:
一个类只能继承一个直接父类。
为什么Java是单继承的?
答:反证法,假如Java可以多继承,请看如下代码:
class A{
public void test(){
System.out.println("A");
}
}
class B{
public void test(){
System.out.println("B");
}
}
class C extends A , B {
public static void main(String[] args){
C c = new C();
c.test(); // 出现了类的二义性!所以Java不能多继承!!
}
}

浙公网安备 33010602011771号