繁体   English   中英

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

[英]java access modifier- visibility of attributes whose type is other class. why it is visible or not?

下面是一些 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
    }
}

我无法理解几行 //??? 你能解释为什么这些属性可见或不可见吗?

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

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

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

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

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

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

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

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

private int a - 仅在此类中可见

protected int a - 在这个类和所有扩展这个类的子类中可见

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM