繁体   English   中英

Java编译器在看到关键字extends时会做什么?

[英]What does the Java compiler do when it sees the keyword extends?

请考虑以下代码。

A.java,主要包装:

package pkgs.main;

public class A {
    protected int x;
}

B.java,测试包:

package pkgs.test;
import pkgs.main.A;

public class B extends A {
}

当运行javac编译器时,它是否像这样做:

A.java,主要包装:

package pkgs.main;

public class A {
    protected int x;
}

B.java,测试包:

package pkgs.test;
import pkgs.main.A;

public class B extends A {  
    // Some "flag/code" that says:
    // Must be aware that the following new and seperate copy of x 
    // has originated from class A, which is inside a package called main.
    protected int x;
}

我之所以要问的是,我试图了解子类必须知道其继承成员的所有“属性/属性”才能运行。 如果这是真的,那么这种编程继承会与“现实世界”中的继承略有不同吗? 例如,我从父母那里继承了各种属性,但我完全不知道所有这些信息。 (如果我的父母要去世,我可以继续操作。)然而,我想知道Java的继承在这个意义上是不是独立的,如果子类必须始终知道它从哪里得到它的继承成员,为了正确操作。

问题是,在阅读编程书籍中的继承时,我感到困惑。 它们提供了涉及动物,猫和狗等现实世界对象的示例,但基于上面的段落,我想知道Java继承与Java书籍中涉及这些类型的继承示例之间是否存在微妙的“机制差异”现实世界的对象。

我与Java有关的问题是我不明白为什么我被允许执行以下操作。 下面的代码是“主类”中的一些简单的“调用代码”,涉及上面已经定义的两个类(A和B)。

Main.java,主要包:

package pkgs.main;
import pkgs.test.B;

// Just some method inside the "main class"
void method() {
    B b = new B();
    b.x ++;  //   <--- why is this allowed?
}

这个“调用代码”在一个名为main的包中,而类B在一个名为test的不同包中定义。 这个调用代码没有扩展B类,那么为什么Java允许访问B的受保护成员x?

的解释是,因为受保护的成员x原本A级,这在同一个包调用代码内声明的? 如果是真的,那么这大致符合我之前的想法,我在这里谈到了B类:

public class B extends A {  
    // Some "flag/code" that says:
    // Must be aware that the following new and seperate copy of x 
    // has originated from class A, which is inside a package called main.
    protected int x;
}

Java编译器在看到关键字extends时会做什么?

在你的情况下没有。

这个调用代码没有扩展B类,那么为什么Java允许访问B的受保护成员x?

这是关于可访问性的。 根据Java语言规范(参见JLS7: http ://docs.oracle.com/javase/specs/jls/se7/jls7.pdf)

6.6.1确定可访问性

...

否则,如果成员或构造函数被声明为protected,则只有在满足以下条件之一时才允许访问:

  • 从包含声明受保护成员或构造函数的类的包中发生对成员或构造函数的访问。

  • 如第6.6.2节所述,访问是正确的。

...

您可以从同一个包中访问受保护的字段“x”。 但是如果你在类'B'中声明一个新字段'x'(它隐藏'A.x'),那么你就不能从'main'包中访问'x'(格式为b.x++; )。

// Some "flag/code" that says:
// Must be aware that the following new and seperate copy of x 
// has originated from class A, which is inside a package called main.
protected int x;

没有。没有'新的和单独的x'。 它是从A类继承的'x'。它是一样的。 这可以解释你所有的困惑。

如果一个子类必须知道从哪里得到它的继承成员

当然。

是解释因为受保护的成员最初是在A类中声明的吗?

是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM