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++中,朋友级字段具有完全不同的行为。