[英]Is inheritance compile time or runtime in 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);
}
}
继承是在 Java 编译时最明确地定义的。 我认为您将它与多态混淆了,简而言之,它指出 Java 选择仅在运行时运行的重写方法。
您对compile time和runtime感到困惑。 我不碰你的代码。 但在这里看一个例子
String result = returnInt(); // #1
public int returnInt() {
return 1;
}
如果您看到,在#1
行,您是否认为编译器执行returnInt()
方法会导致编译时错误? 没有权利?
答案是
已经从规范中赋予编译器的所有规则。 它只是检查他们。
java中的继承是通过“extends”关键字实现的,该关键字是为编译时继承保留的。 在您的情况下,您已将基类变量定义为私有。私有成员不会被继承。 私有成员只能通过一些基类方法在子类中访问。
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());
}
}
继承总是在编译时实现。代码在进入jvm进行验证并转换为字节码之前就通过extends关键字获得了可重用性,尽管我们只能在创建对象后在运行时使用它的特性。 和关于私有成员虽然它会被子类继承但不会被访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.