class Parent{//父类

    private int a = 1;//私有权限
    public int b = 1; //公有权限

public int getA() {
     return a;
}

public int getB() {
    return b;
}
    
}


public class Son extends Parent{//子类继承父类
     int b =2;

}

 


class Demo{

public static void main(String[] args) {
Son son = new Son();
System.out.println(son.getA());//结果为 1

System.out.println(son.getB());//结果为 1

                //打印结果为都是 1

针对此结果:1>如果说不能继承私有变量,那子类没有变量a,那如何能打印出变量 a 的结果

                      2>如果单纯的认为继承就是父类的东西已经被子类拿到了,属于子类了。那我们知道子类和父类存在同样的变量时,会被子类覆盖。那                            为何结果不是 2,反而是 1 呢?        

答案是:子类的继承实际是里面包含了一个super域,当子类对象调用一个子类没有的方法getA()时(我们并没有复写),它先在自己的直属空间找,找不到的话,会调用super域的getA()方法(super域也就是我们说的父类)。而super域中的方法只操作自己的变量和方法,子类变量和方法是无法操作的。所以结果都是1.

因为子类对象调用方法和属性是有优先级的,优先调用自己直属属性和方法。如果自己没有,那么就会调用super域的方法和属性(比如当子类的方法操作了一个变量,如果子类没有,它会向super域中去找)。不要误认为super域中的所有字段都是被子类继承,子类和父类都有一份这个被继承的变量。其实是子类间接有的,不是直接有的,子类所拥有的是super域(父类)。   

覆盖的原理就显而易见了,如果操作子类的方法,那么就会在子类变量中去找,如果子类存在此变量,就不会去super域中去找了。不是像IO流那样真正的覆盖,只是不会去super域中去找而已,super域中同名的字段依然安全的存在。

        所以这才是真正的继承!  以下为原理图,作参考!

 

 

 

但是使用反射就能很好的访问父类的私有方法,因为反射不区别是否私有

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 posted on 2018-12-03 20:49  mjx  阅读(399)  评论(0编辑  收藏  举报