我被告知继承是运行时,但我想问一下,如果继承是运行时,那么当我们尝试通过子类对象访问父类数据成员时,编译器如何在编译时生成错误:
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 :(得分:2)
在Java中,在编译时最明确地定义了继承。我认为你将它与多态性混淆在一起,简而言之,它指出Java选择哪种重写方法只能在运行时运行。
答案 1 :(得分:1)
您对编译时和运行时感到困惑。我没有碰你的代码。但请看这里的例子
String result = returnInt(); // #1
public int returnInt() {
return 1;
}
如果你看到,在第#1
行,您认为编译器执行returnInt()
方法会产生编译时错误吗?不对吗?
答案是
已经从规范中给编译器的所有规则。它只是检查它们。
答案 2 :(得分:0)
使用“extends”关键字实现java中的继承,该关键字保留用于编译时继承。 在您的情况下,您已将Base类变量定义为private。不会继承私有成员。只能通过一些Base类方法在子类中访问私有成员。
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());
}
}
答案 3 :(得分:-1)
继承。 即使在进入jvm进行验证之前也可以扩展关键字,从而转换为 字节码,尽管我们只能在创建对象后的运行时使用其功能。 关于私有成员,尽管它将由子类继承,但将不可访问。