Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在'Sub'和'Super'中定义了私有方法,这两个方法都可以在Sub的对象上调用,那个么为什么私有方法说不被继承呢?_Java_Inheritance_Private Methods - Fatal编程技术网

Java 在'Sub'和'Super'中定义了私有方法,这两个方法都可以在Sub的对象上调用,那个么为什么私有方法说不被继承呢?

Java 在'Sub'和'Super'中定义了私有方法,这两个方法都可以在Sub的对象上调用,那个么为什么私有方法说不被继承呢?,java,inheritance,private-methods,Java,Inheritance,Private Methods,依照 子类不继承其父类的私有成员。但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法 [问题] 对于作为Sub扩展Super的类关系, 可以理解的是,Oracle文档这样说只是为了支持只有继承的方法才能被重写这一事实,但这是一种误导性的陈述,似乎暗示=>如果一个方法没有继承,那么它就不会作为子类对象的行为出现,如果是这样,那么它就不能在子类对象上被调用。但是Super类中的方法可以调用Super类在子类的对象上定义的私有方法。 请参考以下要点和相关代码,并建议我的理解是

依照

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

[问题] 对于作为Sub扩展Super的类关系, 可以理解的是,Oracle文档这样说只是为了支持只有继承的方法才能被重写这一事实,但这是一种误导性的陈述,似乎暗示=>如果一个方法没有继承,那么它就不会作为子类对象的行为出现,如果是这样,那么它就不能在子类对象上被调用。但是Super类中的方法可以调用Super类在子类的对象上定义的私有方法。 请参考以下要点和相关代码,并建议我的理解是否有差距

我一直理解如下3点的继承

子类继承所有实例方法和字段,包括私有类。 如果一个方法在Super中是私有的,那么它在Sub中不可见,但这并不意味着Sub的对象没有该行为。 第1点和第2点的代码

我们已经创建了Sub的对象,m由Sub继承,它的公共含义是它可以被Super之外的代码访问。在调用m时,我们可以调用privateMethod。如果未继承私有方法,则可能会发生一些运行时异常,但实际情况并非如此

重写仅适用于子类中的可见实例方法。如果一个方法不可见,并且在Sub和Super这两个类中都定义了一个,那么该对象具有这两个功能,并且这两个方法都可以由可以访问特定方法的代码调用。请参阅下面的代码 第3点的代码


如果说Sub类不从Super继承私有方法,则意味着无法对Sub的对象调用方法,因为该行为未被继承,因此的任何部分都不属于该对象。上面我们看到的情况并非如此

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

由于privateMethod不是由Sub继承的,因此在其中实现的privateMethod不是一个重写,而是一个碰巧具有相同签名的方法。如果您没有在Sub中定义方法,您将无法使用s.m2,它是s.privateMethod

但是Super类中的方法可以调用 超级班


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

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

说:

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

但是,在描述新操作员的行为时,emphasis mine说:

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

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

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


这是因为子类型是一种关系。子类型的实例就是超类型的实例。该类不会将这些成员继承到自身中,但该类的实例仍包含这些成员。

您可能需要更改子类方法的输出。删除这些方法后,子实例将无法使用这些方法,您也不能直接从其他方法调用它们,这就是它的意思。@daniu请详细说明您所指的方法,为了更好地理解,我对问题进行了编辑。实际上,您所说的正相反。如果私有方法没有包装在任何非公共方法中,那么私有方法就没有多大用处。它是定义类与依赖类或用户类的契约的公共方法,内部实现是在私有方法中完成的。您可以在java.util.ArrayList中引用“ensureCapacity”的公共方法,它使用私有的grow方法。这只是其中之一example@Ety始终私有方法必须是从调用公共方法或
公共构造函数,以便有用。在java.util.ArrayList中引用“ensureCapacity”及其公共方法,它使用私有的grow方法。我发表评论是因为你说用公共方法包装privateMethod是不合逻辑的…@Daniel Pryden我删除了那条评论并重新措辞了itthanks,这是我在阅读你的答案后所做的第一次编辑:更正错误:将引用的语句称为oracle文档,而不是oracle教程。另外,我觉得最好使用word包含sub的对象包含在超类中私有的方法,如果两个类都有相同的方法,那么它将同时包含这两个类,并且将根据调用代码调用方法。
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(); 
    }
}
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
    }
}