您的位置:首页 > 其它

父类私有变量是否被子类继承详细解说(答案:内存中存在,但sun公司定义为不继承)

2017-07-05 10:31 302 查看
因为网上就父类私有属性是否被子类继承一直争论不休,以下为了解释清楚,本人做了大量详细说明,请不要嫌我啰嗦,都是基础的知识,认真看完你会明白的。

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域中同名的字段依然安全的存在。

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



那么子类继承了父类私有属性吗?

这个问题官方原文是这样的:

       A subclass does not inherit the private members of its parent class. However, if the superclass
has public or protected methods for accessing its private fields, these can also be used by the subclass. 

最后解释:为何很多人认为子类不能继承父类的私有属性,因为老大都这么说了嘛!!!但请注意老大同时也说了,如果父类中有get或者set方法时,子类也可以拿到父类的私有属性。其实要按内存角度说也是继承的,因为它确实也存在于内存的子类对象的super域中,只是子类看不见而已。其实sun公司说的不继承,是当子类继承父类时,如果子类看不到父类的属性,那么就认为是不继承的,没有说子类对象中不存在父类的私有属性。

   PS:如果您觉得此文好,请扩散!

     }
}

转载自:http://blog.csdn.net/mr_duantao/article/details/50966471
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: