Java 为什么代码会产生以下结果?
我对下一个片段感到困惑和浪费。我猜这都是因为静态的内部类和类A1的函数的范围 如果您有详细的解释,请分享Java 为什么代码会产生以下结果?,java,oop,inheritance,polymorphism,inner-classes,Java,Oop,Inheritance,Polymorphism,Inner Classes,我对下一个片段感到困惑和浪费。我猜这都是因为静态的内部类和类A1的函数的范围 如果您有详细的解释,请分享 public class Main { static class A1 { private void f() { System.out.println("A1");} } static class A2 extends A1 { public void f() {System.out.println("A2");} }
public class Main {
static class A1 {
private void f() { System.out.println("A1");}
}
static class A2 extends A1 {
public void f() {System.out.println("A2");}
}
static class A3 extends A2 {
public void f() {System.out.println("A3");}
}
public static void main(String[] args) {
A1 a1 = new A1();
a1.f();
a1 = new A2();
a1.f();
a1 = new A3();
a1.f();
}
}
预期:
A1
A2
A3
实际:
A1
A1
A1
A1
中的方法f()
标记为private
。这意味着它不会被A2
或A3
继承。这意味着多态性不会在A2
或A3
中找到覆盖方法f()。但是,由于A1
是一个嵌套类,因此封闭的Main
类仍然可以访问它,因此它可以编译。结果是打印了3次A1
如果试图在A2
中的f()
上放置@覆盖
注释,则可能会看到错误。如果您将f()
更改为public
,protected
,或者A1
中没有访问修饰符(“包访问”),那么f()
将按照您的预期被继承,这样输出将与您预期的一样,同时输出A1
,A2
,以及A3
。方法f()A1
中的
标记为private
。这意味着它不会被A2
或A3
继承。这意味着多态性不会在A2
或A3
中找到覆盖方法f()。但是,由于A1
是一个嵌套类,因此封闭的Main
类仍然可以访问它,因此它可以编译。结果是打印了3次A1
如果试图在A2
中的f()
上放置@覆盖
注释,则可能会看到错误。如果将f()
更改为public
、protected
,或者在A1
中没有访问修饰符(“包访问”),则f()
将按预期继承,这样输出将如您所期望的那样,具有A1
、A2
,和正在输出的A3
。private
方法不被继承。f()
方法是从A1重载的,而不是在此过程中被重写situation@HovercraftFullOfEels我想你的意思是它是隐藏的。private
方法不是继承的。f()
方法是从A1重载的,在本文件中未被覆盖situation@HovercraftFullOfEels我想你的意思是它是隐藏的。受保护
就足够了,不需要公开
modifier@aBnormaLz是的;我还添加了不带访问修饰符的案例-包访问。protected
就足够了,不需要public
modifier@aBnormaLz是的;我还添加了不带访问修饰符的case-packageaccess。