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_Polymorphism_Inner Classes - Fatal编程技术网

Java 为什么代码会产生以下结果?

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");} }

我对下一个片段感到困惑和浪费。我猜这都是因为静态的内部类和类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");}
    }

    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。