java继承(零散面试题)

一. Object类

如果没使用 extends 子句指定超类,那么缺省超类是 java.lang. Object

为什么要有这个类?

  1. 多态的方面,可以使用Object 来代替位置参数。
  2. 继承,提供统一标准的方法。

二. 子类继承到底继承了什么?

继承的范围:

成员变量、方法

继承的修饰符条件:

父类修饰符 子类是否会继承 备注
private 如果父子类含有相同的A方法,但父类是private修饰,那么他们互不影响,不属于被覆盖的情况
default 未知 在同一个包下可以继承父类,在不同包下无法继承
protected
public

如何继承父类构造器

某种意义上可以说继承。
子类的构造器必须在第一行调用父类的构造(super),如果无默认的无参构造器,则必须显示调用super指定继承的构造器。

三. 覆写

  1. 条件
    Java判断方法唯一的标准是"方法签名"
    方法签名 = 方法名 + 参数(顺序+类型+个数)
    当父类和子类的方法签名一致时,我们认为子类重写了父类的方法

  2. 子类的方法各个修饰符

修饰符 子类较父类 备注
访问修饰符 大于等于父类 比如:子类是private,而父类是public,那么就访问权限乱套了,那么当子类强制成父类后,这个方法是否可以调用呢?
抛出异常的范围 小于等于父类 同上,如果调用父类被覆盖的方法抛出异常,发现子类的异常比父类的异常大,就没有try-catch住,那就gameover了,注:try-catch时父类异常可以接收子类异常
static 静态方法可以被继承,但无法被重写,且如果父类含有静态方法,那么子类的成员方法的方法签名不能一致
final 如父类方法含有final,则子类无法覆写。
synchronized synchronized 方法被覆写时,无法继承sychronized

四. 一些注意点

  1. final对extends的影响
    1.final修饰类,那么类不能被继承
    2.final修饰方法,那么方法不能被覆写

  2. synchronized 方法被覆写时,无法继承sychronized

问题

1. java的继承具有单根性,即java类仅能继承一个父类,那么为什么java仅能继承一个类?

  1. 容易引起歧义,例如A类有a方法,B类也有a方法,且两个类都a方法的方法签名一致,但是返回值和抛出的异常各不相同,这个时候我们如何选择继承?
  2. 减少代码的复杂程度

2. 为什么说组合,而非继承?

  1. 大量继承的代码 ,难以阅读
  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

你可能感兴趣的:(java继承(零散面试题))