美文网首页
java继承(零散面试题)

java继承(零散面试题)

作者: 良辰夜 | 来源:发表于2018-05-12 01:11 被阅读0次

    一. 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继承(零散面试题)

          本文链接:https://www.haomeiwen.com/subject/nudarftx.html