是java中的继承编译时或运行时

时间:2015-10-16 17:56:26

标签: java inheritance

我被告知继承是运行时,但我想问一下,如果继承是运行时,那么当我们尝试通过子类对象访问父类数据成员时,编译器如何在编译时生成错误:

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

4 个答案:

答案 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进行验证之前也可以扩展关键字,从而转换为 字节码,尽管我们只能在创建对象后的运行时使用其功能。 关于私有成员,尽管它将由子类继承,但将不可访问。