一. Object类
如果没使用 extends 子句指定超类,那么缺省超类是 java.lang. Object
为什么要有这个类?
- 多态的方面,可以使用Object 来代替位置参数。
- 继承,提供统一标准的方法。
二. 子类继承到底继承了什么?
继承的范围:
成员变量、方法
继承的修饰符条件:
父类修饰符 | 子类是否会继承 | 备注 |
---|---|---|
private | 否 | 如果父子类含有相同的A方法,但父类是private修饰,那么他们互不影响,不属于被覆盖的情况 |
default | 未知 | 在同一个包下可以继承父类,在不同包下无法继承 |
protected | 是 | |
public | 是 |
如何继承父类构造器
某种意义上可以说继承。
子类的构造器必须在第一行调用父类的构造(super),如果无默认的无参构造器,则必须显示调用super指定继承的构造器。
三. 覆写
-
条件
Java判断方法唯一的标准是"方法签名"
方法签名 = 方法名 + 参数(顺序+类型+个数)
当父类和子类的方法签名一致时,我们认为子类重写了父类的方法 -
子类的方法各个修饰符
修饰符 | 子类较父类 | 备注 |
---|---|---|
访问修饰符 | 大于等于父类 | 比如:子类是private,而父类是public,那么就访问权限乱套了,那么当子类强制成父类后,这个方法是否可以调用呢? |
抛出异常的范围 | 小于等于父类 | 同上,如果调用父类被覆盖的方法抛出异常,发现子类的异常比父类的异常大,就没有try-catch住,那就gameover了,注:try-catch时父类异常可以接收子类异常 |
static | 无 | 静态方法可以被继承,但无法被重写,且如果父类含有静态方法,那么子类的成员方法的方法签名不能一致 |
final | 无 | 如父类方法含有final,则子类无法覆写。 |
synchronized | 无 | synchronized 方法被覆写时,无法继承sychronized |
四. 一些注意点
-
final对extends的影响
1.final修饰类,那么类不能被继承
2.final修饰方法,那么方法不能被覆写 -
synchronized 方法被覆写时,无法继承sychronized
问题
1. java的继承具有单根性,即java类仅能继承一个父类,那么为什么java仅能继承一个类?
- 容易引起歧义,例如A类有a方法,B类也有a方法,且两个类都a方法的方法签名一致,但是返回值和抛出的异常各不相同,这个时候我们如何选择继承?
- 减少代码的复杂程度
2. 为什么说组合,而非继承?
- 大量继承的代码 ,难以阅读
- 继承需要较高的抽象能力
3. 一道比较极限的题目
public class Test {
// 则下面测试类中的输出结果分别是什么?
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b));
System.out.println(a1.show(c));
System.out.println(a1.show(d));
System.out.println("============");
System.out.println(a2.show(b));
System.out.println(a2.show(c));
System.out.println(a2.show(d));
System.out.println("============");
System.out.println(b.show(b));
System.out.println(b.show(c));
System.out.println(b.show(d));
}
}
class A {
public String show(D d) {
return "A and D";
}
public String show(A a) {
return "A and A";
}
}
class B extends A {
public String show(B b) {
return "B and B";
}
@Override
public String show(A a) {
return "B and A";
}
}
class C extends B {}
class D extends B {}
console:
A and A
A and A
A and D
============ //优先调用最短的继承路径
B and A (有挑战哦)
B and A (有挑战哦)
A and D
============ //对外类型会影响调用哦
B and B
B and B
A and D
网友评论