请考虑以下代码。
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?
}
这个&#34;呼叫代码&#34;在一个名为main的包中,类B在一个名为test的不同包中定义。这个调用代码没有扩展B类,那么为什么Java允许访问B&#39受保护的成员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;
}
答案 0 :(得分:4)
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++;
)。
答案 1 :(得分:3)
// 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类中声明的吗?
是