Java 受保护方法的访问修饰符
对于受保护的访问修饰符,与其关联的方法或属性应该对其子类可见。这是根据定义 但有一件事我无法解释,那就是。例如,我们有以下代码: 基类:Java 受保护方法的访问修饰符,java,modifier,Java,Modifier,对于受保护的访问修饰符,与其关联的方法或属性应该对其子类可见。这是根据定义 但有一件事我无法解释,那就是。例如,我们有以下代码: 基类: package com.set.test; public class ModifierBase { private int privateInt; int friendlyInt; protected int protectedInt; public int publicInt; private void displ
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没有友好的修饰符。这是包级别的权限。我不知道,没有友好的文字作为关键字。我只是想问,为什么declare as基类与declare as subclass具有不同的访问级别。为什么行为与友好访问不同。没有友好访问,只有包级访问。并且它们在不同的包中。友好访问=包访问。只是换个说法而已。同样的事情……恐怕你弄错了。它们根本不是一回事;在C++中,朋友级字段具有完全不同的行为。