java访问修饰符-类型为其他类的属性的可见性。为什么它是可见的或不可见的?

java访问修饰符-类型为其他类的属性的可见性。为什么它是可见的或不可见的?,java,modifier,Java,Modifier,下面是一些嵌套的java访问修饰符示例。当类具有类型为其他类的属性时,我无法清楚地找出答案 package packageX; import packageY.*; public class A { public int x; private int y; protected int z; public A objA; public C objC; void test(){ System.out.println(x);

下面是一些嵌套的java访问修饰符示例。当类具有类型为其他类的属性时,我无法清楚地找出答案

package packageX;
import packageY.*;

public class A {
    public int x;
    private int y;
    protected int z;

    public A objA;
    public C objC;

    void test(){
        System.out.println(x);
        System.out.println(y);
        System.out.println(z);

        System.out.println(objA.x);
        System.out.println(objA.y);
        System.out.println(objA.z);

        System.out.println(objC.x);
        System.out.println(objC.y);//not visible
        System.out.println(objC.z);//?? why visible?
    }
}

class B{
    public A objA;
    public C objC;

    void test(){
        System.out.println(x);//not visible
        System.out.println(y);//not visible
        System.out.println(z);//not visible

        System.out.println(objA.x);
        System.out.println(objA.y);//not visible
        System.out.println(objA.z);

        System.out.println(objC.x);
        System.out.println(objC.y);//not visible
        System.out.println(objC.z);//?? why visible?
    }
}



package packageY;
import packageX.*;

public class C extends A{
    public A objA;
    public C objC;

    void test(){
        System.out.println(x);
        System.out.println(y);//not visible
        System.out.println(z);

        System.out.println(objA.x);
        System.out.println(objA.y);//not visible
        System.out.println(objA.z);//not visible//??? why not visible?

        System.out.println(objC.x);
        System.out.println(objC.y);//not visible//??? why visible?
        System.out.println(objC.z);
    }

}

class D{
    public A objA;
    public C objC;

    void test(){
        System.out.println(x);//not visible
        System.out.println(y);//not visible
        System.out.println(z);//not visible

        System.out.println(objA.x);
        System.out.println(objA.y);//not visible
        System.out.println(objA.z);//not visible

        System.out.println(objC.x);
        System.out.println(objC.y);//not visible
        System.out.println(objC.z);//not visible//??? why not visible
    }
}
我听不懂几行带/???你能解释为什么属性是可见的还是不可见的吗

这将解释访问

y
C
中不可见,因为
C
扩展了
A
并且
A
已将
y
设为私有。因此,
C
无法看到
y

z
受到保护,因此子类可以看到
z

类B看不到这些变量中的任何一个,因为它不从任何其他类继承,也不定义这些变量

在B类中,
objA.y
无法访问,因为y是私有的。不能从声明私有变量的类外部访问它

objC.z
可见,因为受保护的成员可以通过子类访问


阅读我提供的链接。它在第一个表中解释了这一点。

也许现在是阅读一些基本文档的时候了

private int a
-仅在此类中可见

protected int a
-在此类以及扩展此类的所有子类中可见

int a
-从与该类相同的包中的所有类可见


public int a
-从任何其他类可见

请将所有相关代码作为文本而不是图像发布。请同时发布所有相关类(即:
a
)是的,我知道x、y、z的情况。我想知道的是objA和objC的情况。例如,objC.z在类A中是可见的,但据我所知,C是在其他包中定义的,所以objC.z(protected->应该在同一个包中看到,并且它的子类)在Abut中不可见,这不是C的一个is超类吗?objC.z是从A继承的。z属于A。它是受保护的,因此它可以被C的实例访问。C的实例可以由任何类创建,它们可以访问z。即使超级类创建了子类的实例..谢谢!那么你能告诉我为什么objA.y,objA.z在C类中不可见吗??根据您的评论,类a的实例可以访问x、y和z(objA.x、objA.y、objA.z),但它不在类C中。D与a不在同一个包中,因此无法访问受保护的成员,如z。请阅读我提供的链接,它用一个简单的例子解释了所有这一切。C类中的objA.z如何。因为C是objA的子类。C中的z(受保护)应该是可见的,但它不是objC,只有属于objC的z在objC中可见。不是从其他地方来的。如果需要,请使用
public
,或者如果类在同一个包中,则使用包可见性(不带修改器)。