【发布时间】:2025-12-06 23:20:08
【问题描述】:
子类不继承其父类的私有成员。但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法。
[问题]
对于Sub extends Super 的类关系,
据了解,Oracle 文档这样说只是为了支持“只能重写继承的方法”这一事实,但这是一种 误导 声明,好像它似乎暗示 => 如果方法不是继承的,那么它就不会作为 Sub 类对象的行为存在,如果是这样,那么它决不能在 Sub 类的对象上调用。但是 Super 类中的方法可以调用 Super 类在 Sub 类的 Object 上定义的私有方法。
请参考以下几点和相关代码,并提出我的理解是否存在差距?
我一直把继承理解为以下3点
- 类
Sub继承所有实例方法和字段(包括私有的)。 - 如果一个方法在
Super中是私有的,那么它在Sub中是不可见的,但这并不意味着Sub的对象没有该行为。
第 1 点和第 2 点的代码
public class Super{
private void privateMethod(){
System.out.println("private method defined in Super");
}
public void m(){
privateMethod();
}
}
public class Sub extends Super{
}
public void Other{
public static void main(String[] args){
Sub s = new Sub();
s.m();
}
}
我们创建了一个Sub的对象,m()被Sub继承,它的public意味着它可以被Super之外的代码访问。在调用m() 时,我们可以调用privateMethod()。如果私有方法没有被继承,那么就会发生一些运行时异常,但事实并非如此。
-
Overriding仅适用于Sub类中的可见 实例方法。如果一个方法是不可见的,并且在Sub和Super这两个类中都定义了,那么该对象具有这两种能力,并且这两种方法都可以由可以访问特定方法的代码调用(参考下面的代码)
第 3 点的代码
public class Super{
private void privateMethod(){
System.out.println("private method defined in Super");
}
public void m(){
privateMethod();
}
}
public class Sub extends Super{
private void privateMethod(){
System.out.println("private method defined in Sub");
}
public void m2(){
privateMethod();
}
}
public class Other{
public static void main(String[] args){
Sub s = new Sub();
s.m(); // m() will invoke private method of Super
s.m2(); // m2() will invoke private method of Sub
}
}
说Sub 类不从Super 继承私有方法意味着不能在Sub 的对象上调用方法,因为该行为不是继承的,因此不是(不属于)对象的一部分.上面我们看到情况并非如此。
【问题讨论】:
-
您可能想要更改
Sub类方法的输出。去掉方法,Sub实例不可用,也不能直接从Other调用,就是这个意思。 -
@daniu 请详细说明您指的是什么方法,我已经编辑了问题以便更好地理解。
标签: java inheritance private-methods