首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在“Sub”和“Super”中定义的私有方法,这两种方法都可以在Sub对象上调用,那么为什么私有方法说不能继承呢?

在“Sub”和“Super”中定义的私有方法,这两种方法都可以在Sub对象上调用,那么为什么私有方法说不能继承呢?
EN

Stack Overflow用户
提问于 2019-05-06 17:46:09
回答 2查看 668关注 0票数 0

根据Oracle教程

子类不继承其父类的私有成员。但是,如果超类有用于访问其私有字段的公共或受保护的方法,子类也可以使用这些方法。

将类关系怀疑为Sub extends Super,据了解,Oracle这么说只是为了支持“只有继承的方法才能被覆盖”这一事实,但这是一种误导性语句,就好像它似乎意味着如果方法没有继承,它就不会作为Sub类对象的行为出现,如果是,那么它就不能在Sub类的对象上调用。但是,类Super中的方法可以在子类的对象上调用class Super定义的私有方法。请参考下面的要点和相关代码,并建议在我的理解中是否存在一些空白?

我一直把继承理解为3点以下

  1. Sub继承所有实例方法和字段(包括私有)。
  2. 如果方法在Super中是私有的,那么它在Sub中是不可见的,但这并不意味着Sub的对象没有这种行为。

第1点和第2点码

代码语言:javascript
复制
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()。如果未继承私有方法,则会出现一些运行时异常,但情况并非如此。

  1. Overriding仅适用于Sub类中的可见实例方法。如果方法不可见,则在两个类( SubSuper )中都定义了a,则对象具有两种功能,这两个方法都可以由可以访问特定方法的代码调用(参见下面的代码)。

第3点码

代码语言:javascript
复制
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对象上调用方法,因为行为不是继承的,因此不属于(不属于)对象。上面我们看到的不是这样的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-06 18:14:02

我认为关键的区别在于Java语言规范如何使用“继承”一词。(请注意,JLS是权威文档,而不是Java教程。)

JLS 8.2,班级成员说:

声明为私有的类的成员不被该类的子类继承。

但是,当描述new操作符的行为时,JLS 15.9.4,类实例创建表达式的运行时计算说:

新对象包含在指定的类类型中声明的所有字段及其所有超类的新实例。

这意味着超类字段不是由子类继承的,但是子类的实例对象仍然包含这些字段。同样的概念也适用于私有方法。

虽然可以对子类的实例调用超类中的私有方法,但该方法在形式上并不是该子类的一部分。私有方法仍然属于超类.

这是因为子类型("is-a")关系的缘故。子类型的实例是超级类型的实例。类没有将这些成员继承到自身中,但是该类的实例仍然包含它们。

票数 1
EN

Stack Overflow用户

发布于 2019-05-06 18:10:36

在您给出的示例中,来自类privateMethodSuper确实是私有的,不能由Sub继承。这样的设计意味着我们不希望子类能够具有privateMethod行为,这就是为什么将privateMethod封装在一个公共方法中是不合逻辑的,Sub类随后可以执行该方法并具有“私有行为”。这样,这个实现就不会在现实生活中使用。

而且,由于privateMethod不是由Sub继承的,因此在其中实现的privateMethod不是覆盖,而是具有相同签名的方法。如果没有在Sub中定义方法,就无法使用s.m2() (即s.privateMethod())。

但是class Super中的方法可以调用Class Super定义的私有方法

这就是它的意义所在:任何类都可以使用自己定义的方法,无论是公共的还是私有的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56010035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档