Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 超类的私有方法在子类引用上执行_Java_Oop_Inheritance_Static - Fatal编程技术网

Java 超类的私有方法在子类引用上执行

Java 超类的私有方法在子类引用上执行,java,oop,inheritance,static,Java,Oop,Inheritance,Static,给定以下代码: 超类: package poc.poc; public class SuperClass { private void method() { System.out.println("SuperClass!"); } public static void main(String[] args) { // TODO Auto-generated method stub SuperClass s = new SubClass();

给定以下代码:

超类:

package poc.poc;

public class SuperClass {

    private void method() {
    System.out.println("SuperClass!");
    }

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    SuperClass s = new SubClass();
    s.method();
    }

}
package poc.poc;

public class SubClass extends SuperClass {
    public void method() {
    System.out.println("Subclass!");
    }
}
子类:

package poc.poc;

public class SuperClass {

    private void method() {
    System.out.println("SuperClass!");
    }

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    SuperClass s = new SubClass();
    s.method();
    }

}
package poc.poc;

public class SubClass extends SuperClass {
    public void method() {
    System.out.println("Subclass!");
    }
}
当我运行
超类
的main方法时,我希望得到某种异常,但实际上运行的是
超类
中的代码,而不是
子类
中的代码,因此在子类实例上运行超类类型的实例方法

为什么会发生这种情况? 编辑:这不违反封装吗


另外,当更改为protected而不是private修饰符时,多态性开始生效,我们又回到了我称之为“预期行为”的状态。

无法重写private方法。相反,子类将隐藏它。这意味着当子类以多态方式使用时,该方法不被视为父类的现有方法之一。这就像一个全新的方法,无法通过多态性实现

私有方法不是父类契约的一部分。多态性仅适用于作为父合同一部分的方法。如果不是这样的话,您可以通过更改实现(作者希望它是私有的),使类的行为与其契约不同。如果作者希望您这样做,他们会使用
protected
。实际上,
private
方法类似于
final


在这个特定的main方法中,因为它是在实际父类中定义的,所以它能够看到私有方法,因此能够调用它。如果您的主方法已在任何其他类中并尝试调用它,则它将失败。

无法重写私有方法。相反,子类将隐藏它。这意味着当子类以多态方式使用时,该方法不被视为父类的现有方法之一。这就像一个全新的方法,无法通过多态性实现

私有方法不是父类契约的一部分。多态性仅适用于作为父合同一部分的方法。如果不是这样的话,您可以通过更改实现(作者希望它是私有的),使类的行为与其契约不同。如果作者希望您这样做,他们会使用
protected
。实际上,
private
方法类似于
final


在这个特定的main方法中,因为它是在实际父类中定义的,所以它能够看到私有方法,因此能够调用它。如果您的main方法位于任何其他类中并试图调用它,它将失败。

私有方法不能被重写,这就解释了您在这里看到的内容。您可以在main中调用该方法,因为main在同一个类中,否则将不可能


您正确地分析了将
private
更改为
protected
时发生的情况:该方法现在是可重写的,并且在子类实例上调用它时执行该方法的“最近”定义。

无法重写私有方法,这就解释了您在此处看到的内容。您可以在main中调用该方法,因为main在同一个类中,否则将不可能


您正确地分析了将
private
更改为
protected
时发生的情况:该方法现在是可重写的,并且在子类实例上调用它时会执行它的“最近”定义。

这是因为private方法在范围内,因为您位于同一文件中。如果您在第三个文件中创建了
main
,您的代码将无法编译。请在子类“
方法”
上添加
@Override
注释,您就会理解。这是因为私有方法在范围内,因为您位于同一个文件中。如果您在第三个文件中创建了
main
,您的代码将无法编译。将
@Override
注释放在子类的
方法
上,您就会明白。子类如何真正能够从超类的私有部分运行代码,这是否违反了封装原则?如果私有方法调用可重写的方法呢?那么会发生什么呢?那不是发生的事情,因为您只能从同一个类的主方法中执行此操作。您无法从其他任何地方执行此操作,因此没有封装issue@VladIlie这不会有什么不同,我可以给你一个例子,说明如果你想的话,它是如何有用的,但是会调用超类方法,还是子类重写了方法?子类如何能够从超类的私有部分运行代码,这是否违反了封装原则?如果私有方法调用可重写的方法呢?那么会发生什么呢?那不是发生的事情,因为您只能从同一个类的主方法中执行此操作。您无法从其他任何地方执行此操作,因此没有封装issue@VladIlie这不会有什么不同,我可以向您展示一个示例,说明如果您想要的话它是如何有用的,但是会调用超类方法,还是子类重写方法?