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. "
      A nested class has access to all the private members of its enclosing class—both fields and methods. Therefore, a public or protected nested class inherited by a subclass has indirect access to all of the private members of the superclass.
详细链接:https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

意思是说:子类不继承private其父类的成员。但是,如果超类具有用于访问其私有字段的公共或受保护的方法,则子类也可以使用这些方法。嵌套类可以访问其封闭类的所有私有成员,包括字段和方法。因此,子类继承的公共或受保护的嵌套类可以间接访问超类的所有私有成员

这是官方的观点,当然有人就有其他的理解

观点二: 父类的任何成员变量都是会被子类继承下去的。子类继承父类,子类拥有了父类的所有属性和方法。父类的私有属性和方法子类是无法直接访问的。当然私有属性可以通过public修饰的get和set方法访问到的,但是私有方法不行。父类的private属性,会被继承并且初始化在子类父对象中,只不过对外不可见。
  详解:分析内存后,会发现,当一个子类被实例化的时候,默认会先调用父类的构造方法对父类进行初始化,即在内存中创建一个父类对象,然后再父类对象的外部放上子类独有的属性,两者合起来成为一个子类的对象。
  所以:子类继承了父类的所有属性和方法或子类拥有父类的所有属性和方法是对的,只不过父类的私有属性和方法,子类是无法直接访到的。即只是拥有,但是无法使用。 (这里不考虑Java反射机制)


二、辨析:

从继承的概念来说,private和final不被继承。Java官方文档上是这么说的。

从内存的角度来说,父类的一切都被继承(从父类构造方法被调用就知道了,因为new一个对象,就会调用构造方法,子类被new的时候就会调用父类的构造方法,所以从内存的角度来说,子类拥有一个完整的父类)。子类对象所引用的内存有父类变量的一份拷贝。
  如图所示,父类为Person类,子类为Student类。首先明确子类不能继承父类的构造方法。这就是为什么子类的默认的构造方法会自动调用父类的默认的构造方法。
  在子类的构造方法中通过super()方法调用父类的构造方法。也就是,在构造子类的同时,为子类构造出跟父类相同的域。如此就在子类的对象中,也拥有了父类声明的域了。
  在这里插入图片描述
  如果一个子类继承了父类,那么这个子类拥有父类所有的成员属性和方法,即使是父类里有private属性的变量,子类也是继承的,只不过不能使用,也就是说,它继承了,但是没有使用权,似乎又点矛盾,用我们通俗的说法就是 只能看,不能用,虽然是这样,但是,我们还是可以通过set和get的方法来间接的访问父类中的private属性的变量。
  关于成员变量的继承,父类的任何成员变量都是会被子类继承下去的,这些继承下来的私有成员虽对子类来说不可见,但子类仍然可以用父类的函数操作他们.

这样的设计的意义就是我们可以用这个方法将我们的成员保护得更好,让子类的设计者也只能通过父类指定的方法修改父类的私有成员,这样将能把类保护得更好,这对一个完整的继承体系是尤为可贵的.


三、总结:

       总之,最后关于Java中子类能不能继承父类的私有变量和方法?,只能这样回答,以官方文档解释说明为准,这里我们明确一下“继承”一词的概念,在 Java 中,继承一词的意义是有限制的。一个子类只能继承其父类的可访问的成员,并且该子类没有覆盖或者说隐藏父类中的那些可访问成员。所以,一个类的成员就是指在这个类中所声明的属性和方法,再加上从其父类继承而来的属性和方法。也就是说,子类是不能继承父类的私有成员的。
       虽然子类不继承父类中的私有成员,但是在父类中生命的这些私有成员仍然是子类类型对象的一部分。因为在实例化对象的时候,只初始化在当前类中所声明的属性明显是不足够的,还需要初始化其父类中所有声明的属性。在实例化的过程中,JVM 需要为对象的类及其父类中所有定义的属性分配空间,包括父类中声明的私有成员。
       所以,我们可以说:子类不能从父类继承私有成员,但是子类的对象是包括子类所不能从父类中继承的私有成员的。

其实我们不用纠结太多,懂得其中的原理,自己心里清楚就行,当然对外解释一切以官方为准。

参考相关文章:
1.https://www.zhihu.com/question/51345942
2.https://blog.csdn.net/lhy_847csdn/article/details/80531706
3.http://www.blogjava.net/sitinspring/archive/2007/12/04/165288.html
4.https://zhidao.baidu.com/question/204223905962624885.html

发布了149 篇原创文章 · 获赞 84 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/weixin_43465312/article/details/101394740