JAVA基于类的访问权限以及protected修饰符的限制

    xiaoxiao2021-11-28  33

    JAVA中有如下四种访问权限:

    1、public 对其它均可见

    2、private 仅本可见

    3、protected 对本包中的以及可见

    4、default(不写访问权限时的默认情况) 对本包中的可见

    注意以上的描述,JAVA的访问权限是基于类的。因此所有教科书中都提到JAVA的访问权限是基于类的,但是protected修饰符却存在者一些限制。

    首先,介绍下什么是基于类的访问权限。

    以private修饰符为例,实例中的私有变量,可以被同一个类的实例直接访问,代码如下:

    package Test; public class Test { public static void main(String []args) { A a1 = new A(); A a2 = new A(); a2.print(); a1.change(a2); a2.print(); } } class A { private int arg = 4; public void change(A a) { a.arg = 3; } public void print() { System.out.println("arg = " + this.arg); } }输出结果:

    arg = 4 arg = 3

    但是,protected修饰符却存在着一些限制,子类实例只能直接访问隐式参数所引用的实例中的protected变量,而不能直接访问超类实例中的protected变量。

    先来看看,子类实例直接访问隐式参数所引用的实例中的protected变量,代码如下:

    package Test; import A.A; import B.B; public class Test { public static void main(String []args) { B b = new B(); b.print(); b.change(); b.print(); } } package A; public class A { protected int arg = 4; public void print() { System.out.println("arg = " + this.arg); } } package B; import A.A; public class B extends A { public void change() { this.arg = 3; } }输出结果:

    arg = 4 arg = 3 再来做个实验,子类实例直接访问超类实例中的protected变量,代码如下:

    package Test; import A.A; import B.B; public class Test { public static void main(String []args) { A a = new A(); B b = new B(); a.print(); b.change(a); a.print(); } } package A; public class A { protected int arg = 4; public void print() { System.out.println("arg = " + this.arg); } } package B; import A.A; public class B extends A { public void change(A a) { a.arg = 3; } }这时,在class B的a.arg = 3这行的下面会出现提示:

    The field A.arg is not visible因此,protected修饰符是存在着限制的,在使用时一定要特别注意。

    转载请注明原文地址: https://ju.6miu.com/read-678554.html

    最新回复(0)