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这不会有什么不同,我可以向您展示一个示例,说明如果您想要的话它是如何有用的,但是会调用超类方法,还是子类重写方法?