Java-子类没有继承父类的私有变量和私有方法

  在Java子类有没有继承父类的私有变量?关于这个问题在网上找了很久,也没有一个明确的答案。于是综合大家的观点,自己总结了一下。 
   
  官方文档的解释:“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.”。原文地址:Inheritance 
  那么问题来了。之前在做Java实验时,为什么Manger类能使用Employee的私有属性呢? 
  我找了一下答案: 
  观点一: 
  “父类中的公有方法和域(属性),在类继承中将会被子类继承,但是私有的将不能被继承。那么在继承中子类如何才能继承到父类的私有域呢?答案是:在子类的构造方法中通过super()方法调用父类的构造方法。”参考:Java中子类继承了父类的私有属性及方法吗?、 
  写了测试代码体会了一下:

public class Father 
{
    private int a;
    public Father()
    {

    }
    public Father(int a)
    {
        this.a = a;
    }
    public int getA()
    {
        return this.a;
    }
}

public class Children extends Father
{
    int b;
    public Children()
    {

    }
    public Children(int a,int b)
    {
        //this.a = a;
        super(a);
        this.b = b;
    }
}

public class Main 
{
    public static void main(String[] args) 
    {
        Children child1 = new Children(13,35);
        System.out.println(child1.b+"  "+child1.getA());

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

  观点二: 
  “父类的任何成员变量都是会被子类继承下去的。实际上,private,public,protected和继承没有关系,他们对成员函数和变量的限制只是在成员的可见性上。”参考:私有的成员能被子类继承吗? 
   
  观点三: 
  “父类的private变量,也会被继承并且初始化在子类父对象中,只不过对外不可见。”。他这个观点的提出是从内存上分析的,值得借鉴。参考:JAVA 继承 父类子类 内存分配 
   
  我的总结: 
  从继承的概念来说,private和final不被继承。Java官方文档上是这么说的。 
  从内存的角度来说,父类的一切都被继承(从父类构造方法被调用就知道了,因为new一个对象,就会调用构造方法,子类被new的时候就会调用父类的构造方法,所以从内存的角度来说,子类拥有一个完整的父类)。子类对象所引用的内存有父类变量的一份拷贝。 
  如图所示,父类为Person类,子类为Student类。首先明确子类不能继承父类的构造方法。这就是为什么子类的默认的构造方法会自动调用父类的默认的构造方法。 
  在子类的构造方法中通过super()方法调用父类的构造方法。也就是,在构造子类的同时,为子类构造出跟父类相同的域。如此就在子类的对象中,也拥有了父类声明的域了。 
  这里写图片描述

posted @ 2016-12-17 15:36  天涯海角路  阅读(3040)  评论(0编辑  收藏  举报