2013-05-13 47 views
0

以下程序在main方法内发生了“obj.method()”行中的编译错误。错误是“来自类Superclass的method method()不可见”。根据我的理解,它应该能够访问子类的公共方法。任何人都可以解释它背后的概念吗?重写的私有方法导致在访问Java中的子类公用方法时出现异常

class Superclass{ 

private void method(){ 
    System.out.println("Inside superclass method"); 
} 

} 

public class MyClass extends Superclass{ 

    public void method(){ 
     System.out.println("Inside subclass method"); 
    } 

    public static void main(String s[]){ 

     Superclass obj = new MyClass(); 
     obj.method(); 

    } 
} 
+3

你不能重写私有方法,如果绝对要重写,则将其声明为protected/public。 – codeMan 2013-05-13 09:23:16

回答

3

从我的理解,应该能够访问子类的公共方法。

是的,但只有当你调用它表达的编译时类型是子类。

所以,如果你改变你的代码:

MyClass obj = new MyClass(); 

那么它应该是罚款。目前,obj的编译时类型只是Superclass,其中并不是有一个公开的method方法。

另请注意,MyClass.method确实不是覆盖Superclass.method。在Superclass内调用method()只会调用Superclass.method(),即使对象的实际类型为MyClass

+0

谢谢你的回答。我明白了。 – 2013-05-13 09:54:00

1

method宣布为privateSuperclassprivate意味着它只能在该类中访问。如果您希望子类能够访问它(或覆盖它),则必须声明protected

+0

我会回答你的回答,如果你想覆盖已经在超类中定义的方法,你必须添加'@ Override'注解。可能你的IDE会向你推荐它。 – DaGLiMiOuX 2013-05-13 09:25:55

+0

@DaGLiMiOux您通常不需要。但它的建议,因为它会给编译时间警告,你实际上并没有在这种情况下覆盖任何方法。 – NilsH 2013-05-13 09:26:36

+0

是的,我说'你一定需要',但它是可选的:) – DaGLiMiOuX 2013-05-13 09:27:36

0

obj具有参考SuperClass。所以它只能看到SuperClass方法是protecteddefaultpublic
私有方法仅在类中可见。

No Overriding happens here. 
+0

obj是MyClass的一个实例 – pbespechnyi 2013-05-13 09:25:01

相关问题