关于private修饰的变量和方法,子类不能继承问题的讨论

发布于:2021-10-17 06:00:16


public class TestExtends {

public static void main(String[] args) {
Father f = new Son();
Son s = new Son();
● f.FMethod(); // 断点所在位置
s.FMethod();
}
}

class Father{
protected int k = 0;
private int p = 1;
private final int q = 100;
public void FMethod(){}
}

class Son extends Father {
}

下面两种情况子类是不能继承的:
(1)父类中private修饰的私有变量和方法,子类不能继承;
(2)父类的构造方法子类不能继承


----------------------------------------------------------------------------------------------------------------------------------
为什么父类中private修饰的私有变量和方法,子类不能继承,
观点一:官方解释:



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 toall of the private members of the superclass.



详细链接:https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
意思是说:子类不继承private其父类的成员。但是,如果超类具有用于访问其私有字段的公共或受保护的方法,则子类也可以使用这些方法。 嵌套类可以访问其封闭类的所有私有成员,包括字段和方法。因此, 子类继承的公共或受保护的嵌套类可以间接访问超类的所有私有成员


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


----------------------------------------------------------------------------------------------------------------------------------


问题延伸:
1.为什么成员内部类可以无条件访问外部类的成员?



我们在定义的内部类的构造器是无参构造器,编译器还是会默认添加一个参数,该参数的类型为指向外部类对象的一个引用,所以成员内部类中的Outter this&0 指针便指向了外部类对象,因此可以在成员内部类中随意访问外部类的成员。从这里也间接说明了成员内部类是依赖于外部类的,如果没有创建外部类的对象,则无法对Outter this&0引用进行初始化赋值,也就无法创建成员内部类的对象了。



2.为什么在Java中需要内部类?总结一下主要有以下四点:



1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,
2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
3.方便编写事件驱动程序
4.方便编写线程代码


相关推荐

最新更新

猜你喜欢