`Sub` 和 `Super` 中定义的私有方法,都可以在 Sub 的 Object 上调用,那为什么私有方法说不被继承呢?
Private method defined in `Sub` and `Super`, both methods can be invoked on Object of Sub , then why private method said not being inherited?
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.
[问题]
对于 class 关系 Sub extends Super
,
据了解,Oracle 文档这样说只是为了支持 "only inherited methods can be overridden" 这一事实,但它有点 误导性 声明,好像它似乎暗示 => 如果一个方法不是继承的,那么它就不会作为 Sub class 的对象的行为出现,如果是这样,那么它就不能在 Sub class 的对象上调用。但是class Super 中的方法可以在Sub class 的对象上调用Class Super 定义的私有方法。
请参考以下要点和相关代码,如果我的理解存在差距,请提出建议?
我对传承的理解一直是以下3点
- A class
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
仅适用于 visible 实例方法 Sub
class。如果一个方法在 classes、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
class 不从 Super
继承私有方法意味着不能在 Sub
的对象上调用方法,因为行为不是继承的,因此不是(不属于)对象的一部分。上面我们看到不是这样的。
在您给出的示例中,来自 class Super
的 privateMethod
确实是私有的,不能被 Sub
继承。这样的设计意味着我们不希望 subclasses 能够有 privateMethod
行为,这就是为什么将 privateMethod
包装在 public 方法中是不合逻辑的,这然后 Sub
class 可以执行并拥有 "private behavior"。
所以这个实现不会在现实生活中使用。
并且由于 privateMethod
没有被 Sub
继承,所以其中实现的 privateMethod
不是覆盖,而是恰好具有相同签名的方法。如果您没有在 Sub
中定义方法,您将无法使用 s.m2()
(即 s.privateMethod()
)。
But a method in class Super can invoke the private method defined by
Class Super
这就是它的意思:任何 class 都可以使用自己定义的方法,无论是 public 还是私有的。
我认为主要区别在于 Java 语言规范如何使用术语 "inherit"。 (注意 JLS 是权威文档,不是 Java 教程。)
Members of a class that are declared private are not inherited by subclasses of that class.
但是,在描述 new
运算符的行为时,JLS 15.9.4, Run-Time Evaluation of Class Instance Creation Expressions 说(强调我的):
The new object contains new instances of all the fields declared in the specified class type and all its superclasses.
这意味着超级class字段不是由子class继承,而是实例 ] 子 class 的对象仍然包含那些字段。同样的概念也适用于私有方法。
虽然 superclass 的私有方法可以在 subclass 的实例上调用,但该方法在形式上并不是该 subclass 的一部分。 私有方法仍然属于superclass.
这是因为子类型化 ("is-a") 关系。子类型 的实例是 超类型的实例。 class 不会将这些成员继承到自身中,但 class 的 实例 仍然包含它们。
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.
[问题]
对于 class 关系 Sub extends Super
,
据了解,Oracle 文档这样说只是为了支持 "only inherited methods can be overridden" 这一事实,但它有点 误导性 声明,好像它似乎暗示 => 如果一个方法不是继承的,那么它就不会作为 Sub class 的对象的行为出现,如果是这样,那么它就不能在 Sub class 的对象上调用。但是class Super 中的方法可以在Sub class 的对象上调用Class Super 定义的私有方法。
请参考以下要点和相关代码,如果我的理解存在差距,请提出建议?
我对传承的理解一直是以下3点
- A class
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
仅适用于 visible 实例方法Sub
class。如果一个方法在 classes、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
class 不从 Super
继承私有方法意味着不能在 Sub
的对象上调用方法,因为行为不是继承的,因此不是(不属于)对象的一部分。上面我们看到不是这样的。
在您给出的示例中,来自 class Super
的 privateMethod
确实是私有的,不能被 Sub
继承。这样的设计意味着我们不希望 subclasses 能够有 privateMethod
行为,这就是为什么将 privateMethod
包装在 public 方法中是不合逻辑的,这然后 Sub
class 可以执行并拥有 "private behavior"。
所以这个实现不会在现实生活中使用。
并且由于 privateMethod
没有被 Sub
继承,所以其中实现的 privateMethod
不是覆盖,而是恰好具有相同签名的方法。如果您没有在 Sub
中定义方法,您将无法使用 s.m2()
(即 s.privateMethod()
)。
But a method in class Super can invoke the private method defined by Class Super
这就是它的意思:任何 class 都可以使用自己定义的方法,无论是 public 还是私有的。
我认为主要区别在于 Java 语言规范如何使用术语 "inherit"。 (注意 JLS 是权威文档,不是 Java 教程。)
Members of a class that are declared private are not inherited by subclasses of that class.
但是,在描述 new
运算符的行为时,JLS 15.9.4, Run-Time Evaluation of Class Instance Creation Expressions 说(强调我的):
The new object contains new instances of all the fields declared in the specified class type and all its superclasses.
这意味着超级class字段不是由子class继承,而是实例 ] 子 class 的对象仍然包含那些字段。同样的概念也适用于私有方法。
虽然 superclass 的私有方法可以在 subclass 的实例上调用,但该方法在形式上并不是该 subclass 的一部分。 私有方法仍然属于superclass.
这是因为子类型化 ("is-a") 关系。子类型 的实例是 超类型的实例。 class 不会将这些成员继承到自身中,但 class 的 实例 仍然包含它们。