什么是继承
子承父业
老子有的,儿子就有。儿子有的,老子没有
怎么判断他们是否适合继承
- 字面上:is a
- 功能上:该子类中是不是应该拥有父类的所有(构造器除外)
为什么使用继承
- 提高代码的复用性
几个类中,都拥有共同的属性或者方法,出现代码的冗余。
把共同属性、方法提取。存放于一个类中此类成为父类。
其子类只需要写自己特有的属性即可。
当然,一个类中的属性全是其他类的共同属性,此类即可作为父类。并非要创建新类存储 - 利于维护
我们要改共同的属性时,改父类就可以了 - 继承让类与类之间产生了关系,可以创建更加特殊的类型(多态)
如何使用继承
- 关键字: extends <明确子类是父类的扩展>
- 格式:
class A extends B{
}
子类: A
父类(超类、基类):B
继承的注意
- private属性继承问题:
通过继承,子类可以“继承”父类中所有的属性(包括私有的)和方法。构造器除外,但是因为 private 修饰符的作用(只能在本类被访问)子类不能直接访问
必须通过公共的 get/set 方法进行访问 - 不能为了简化代码,获取某功能而继承,应满足一定的所属关系: is a
- Java 只支持单继承,不支持多继承
一个父类可以有多个子类,但是一个子类只能有一个父类 - Java 支持多层继承
class A{
void test1(){
输出11111111111111
}
}
class B{
void test2(){
输出22222222222222
}
}
class C extends B{
则C拥有了A的方法也用有了B的方法,就是因为B继承了A
}
方法的重写(方法的覆盖 Override)
-
定义:当子类继承父类后,若 子类 有与 父类 中的方法签名一模一样的方法时构成覆盖,当子类对象,调用该方法,实际运行的是子类的方法,就如同将父类中的方法覆盖了一样。
-
重写的规则
前提:要有继承关系
- 方法名和参数列表必须相同
- 子类重写方法的访问控制修饰符不能小于父类被重写方法的访问控制修饰符
- 如何使用方法的重写?
- 什么情况下用:
若父类中的方法对于子类来说不适用时,子类可以对父类中的方法进行重写 - 使子类和父类的方法签名一模一样(要重写就一样,这样一定会构成重写)
-
重写的意义:保留父类功能的继承上,还能对此功能进行扩展
-----更体现子类是父类的“扩展” -
【面试题】 Overload 和 Override 的区别?
- 重载
Overload的前提是在同一个类中
修饰符,方法名,返回值相同
参数列表不同时,构成重载 - 重写
Override的前提是继承关系中
父类的方法对于子类不适用时
方法的整个签名一致,构成重 写
super 关键字
-
super 关键字:代父类对象引用
super.属性 super.方法 super(… …) : 调用父类构造器
-
在多层继承中如何确定super是哪个父类
- 若多层父类中没有相同的属性,就不存在区分super是哪个父类的问题
比如int age是从Person来的。指的就是Person
Person{
int age;
}
class Employee extends Person{
}
class Manager extends Employee{
}
- 若多层父类中存在了相同的属性,那么,哪个子类使用super,指向的就是该子类的父类,是不会再考虑该子类的爷爷。此时super指的就是Employee
Person{
int age;
}
class Employee extends Person{
int age;
}
class Manager extends Employee{
super.age;
}
- super的规则
-
当子类继承父类后,子类“所有”构造器中默认第一行第一句有一个隐式的: super()
① super() 作用:调用父类无参构造器
② super() 目的:当子类继承父类后,就继承了父类中所有的属性
因此子类必须知道父类如何为对象进行初始化 -
若父类中没有提供无参构造器,子类“所有”构造器必须显示调用父类的有参构造器
①若子类不显示调用super("张三"),还是系统默认隐式的super(),就会编译报错,因为父类没有无参构造器这也是我们写类时,会手写无参构造器的原因,通常我们会写有参的构造器,但是系统看到有参构造器后就不自动提供无参构造器了,当无手写,子类又没显示调用,就编译报错了
②显示了super("张三")后,系统默认隐式的super()将不再提供 -
super() 和 this() 必须使用在构造器的可执行代码的首行
因此,super() 和 this() 不能同时出现在一个构造器中
网友评论