2015-10-16 40 views
4

有人告诉我继承是运行时,但我想问一下,如果继承是运行时,那么当编译时我们试图通过子类访问父类数据成员时,编译器如何产生错误object:在java中继承编译时或运行时

class PrivateData { 
    private int x = 50; 

    void show() { 
     System.out.println(x); 
    } 
} 

class ChildPrivateData extends PrivateData { 

    public static void main(String s[]) { 
     ChildPrivateData c1 = new ChildPrivateData(); 
     System.out.println(c1.x); 
    } 
} 
+0

检查[为什么只继承在编译时定义的?](http://programmers.stackexchange.com/questions/224972/why-is-inheritance-only-defined-at-compile-time) – sam

回答

2

继承是Java中编译时最明确定义的。我认为你把它与多态性混淆起来,简而言之,它指出Java选择哪种重写方法只在运行时运行。

1

你很困惑编译时间运行时。我不碰你的代码。但在这里看到

String result = returnInt(); // #1 

public int returnInt() { 
return 1; 
} 

如果你看到,在线#1一个例子,你认为编译器执行returnInt()方法给一个编译时错误?无权利?

答案是

所有的规则已经从规范中提供给Compiler。它只是检查他们。

0

java中的继承是通过“extends”关键字实现的,该关键字是为编译时继承而保留的。 在你的情况下,你已经将Base类变量定义为private。私有成员不会被继承。私人成员只能通过某种基类方法在子类中进行访问。

class PrivateData{ 
    private int x =50; 

    void show(){ 
    System.out.println(x); 
    } 
} 

class ChildPrivateData extends PrivateData { 

    public static void main(String s[]){ 
     ChildPrivateData c1 = new ChildPrivateData(); 
     System.out.println(c1.show()); 
    } 
}