【发布时间】:2014-12-29 10:59:59
【问题描述】:
对于受保护的访问修饰符,与其关联的方法或属性应该对其子类可见。这是根据定义。
但有一件事我在这里无法解释。例如,我们有以下代码: 基类:
package com.set.test;
public class ModifierBase {
private int privateInt;
int friendlyInt;
protected int protectedInt;
public int publicInt;
private void displayPrivate(){
System.out.println("displayPrivate");
}
void displayFriendly(){
System.out.println("displayFriendly");
}
protected void displaoyProtected(){
System.out.println("displaoyProtected");
}
public void displayPublic(){
System.out.println("displayPublic");
}
}
一个类在不同的包中扩展了这个。
package com.another;
import com.set.test.ModifierBase;
public class ModifierSubPackgeExtend extends ModifierBase{
public static void main(String[] args) {
ModifierSubPackgeExtend m = new ModifierSubPackgeExtend();
ModifierBase mb = new ModifierSubPackgeExtend();
}
}
m 可以访问受保护的和公共的,这很酷。 但是,mb 无法访问受保护的方法或变量。
mb.protectedInt //is not accessable
m.protectedInt //is accessible
这是为什么呢?
但是对于友好的有同样的例子:
package com.set.test;
public class ModifierExtend extends ModifierBase {
public static void main(String[] args) {
ModifierExtend m = new ModifierExtend();
ModifierBase mb = new ModifierExtend();
}
}
m 和 mb 都可以访问友好修饰符。
m.friendlyInt
mb.friendlyInt
他们都很好。
为什么在使用基类声明并使用子类初始化时,对受保护的访问权限与使用子类声明和初始化两者的访问权限不同?
【问题讨论】:
-
您到底想完成什么?此外,java 没有
friendly修饰符。这是包级别的权限。 -
我不,没有友好的文字作为关键字。我只是问为什么声明为基类与声明为子类相比具有不同的访问级别。与友好访问相比,为什么行为不一样。
-
没有友好访问,只有包级访问。而且它们在不同的包中。
-
友好访问 = 包访问。只是叫法不同而已。同样的事情......
-
恐怕你弄错了。它们根本不是一回事。在 C++ 中,朋友级别的字段具有完全不同的行为。