gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:26:38 25 4
gpt4 key购买 nike

考虑以下代码。

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

我问的原因是我试图了解子类是否必须了解其继承成员的所有“特性/属性”才能运行是否必不可少。如果这是真的,那么这种编程继承与“现实世界”中的继承会略有不同吗?例如,我从 parent 那里继承了各种属性(property),但我可以完全不知道所有这些信息。 (比如说,如果我的 parent 去世了,我可以继续经营。)然而,我想知道 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 的 protected 成员 x?

解释是因为 protected 成员 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;
}

最佳答案

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

你的情况没有。

This calling code is not extending class B, so why does Java allow access to B's protected member x?

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

6.6.1 Determining Accessibility

...

Otherwise, if the member or constructor is declared protected, then access is permitted only when one of the following is true:

  • Access to the member or constructor occurs from within the package containing the class in which the protected member or constructor is declared.

  • Access is correct as described in §6.6.2.

...

您可以从同一个包访问 protected 字段“x”。但是,如果您在类“B”(隐藏“A.x”)中声明一个新字段“x”,则您无法访问“x”(格式为 b.x++;)包“主要”。

关于java - 当 Java 编译器看到关键字 extends 时会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23153373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com