java access modifier-类型为其他类的属性的可见性。为什么它是可见的?

时间:2017-05-16 12:03:18

标签: java access 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);
        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
    }
}

我无法理解// ???你能否解释为什么属性可见?

2 个答案:

答案 0 :(得分:0)

这将解释Access https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

y中无法看到

C,因为C扩展了AA已将y设为私有。因此,C看不到y

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

B类无法看到任何这些变量,因为它不会从任何其他类继承,也不会定义这些变量。

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

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

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

答案 1 :(得分:0)

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

private int a - 仅在此课程中可见

protected int a - 在此课程和所有扩展此课程的子课程中都可见

int a - 与此类

在同一个包中的所有类都可见

public int a - 可从任何其他课程中看到