《java访问权限修饰限制符解析》由会员分享,可在线阅读,更多相关《java访问权限修饰限制符解析(4页珍藏版)》请在金锄头文库上搜索。
1、Java 语言的访问权限修饰符一个 Java 应用有很多类,但是有些类,并不希望被其他类使用。每个类中都有 数据成员和方法成员, 但是并不是每个数据和方法,都允许在其他类中调用。 如 何能做到访问控制呢?就需要使用访问权限修饰符。Java 语言中的访问权限修饰符有4 种,但是仅有 3个关键字,因为不写访问权 限,在 Java 中被称为默认权限,或同包权限,本文中以(default )代替。下面 按照权限从小到大的顺序对4 中访问权限分别介绍。1. 私有权限( private )private可以修饰数据成员, 构造方法,方法成员,不能修饰类 (此处指外部类, 不考虑内部类)。被 private
2、修饰的成员,只能在定义它们的类中使用,在其他 类中不能调用。2. 默认权限( default )类,数据成员,构造方法,方法成员, 都能够使用默认权限, 即不写任何关键字。 默认权限即同包权限, 同包权限的元素只能在定义它们的类中,以及同包的类中 被调用。3. 受保护权限( protected )protected可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部 类,不考虑内部类)。被protected修饰的成员,能在定义它们的类中,同包的 类中被调用。 如果有不同包的类想调用它们, 那么这个类必须是定义它们的类的 子类。4. 公共权限( public )public可以修饰类,数
3、据成员,构造方法,方法成员。被public修饰的成员, 可以在任何一个类中被调用,不管同包或不同包,是权限最大的一个修饰符。有关 Java 语言的修饰符,需要注意的问题有如下几个:1. 并不是每个修饰符都可以修饰类(指外部类) ,只有 public和 default可以。2. 所有修饰符都可以修饰数据成员,方法成员,构造方法。3. 为了代码安全起见,修饰符不要尽量使用权限大的,而是适用即可。比如,数 据成员,如果没有特殊需要,尽可能用private 。4. 修饰符修饰的是“被访问”的权限。Java 代码1. import java.util.Stack; 2. 3. public class
4、aClass 4. fun() 5. static int i = 0; 6. i+; 7. 8. 9. public static void main(String args) 1. aClass obj = new aClass(); 10. obj.fun(); 11. obj.fun(); 12. 13. 14. question is :what will be the value of I ? A. Compilation error B. Run time Error C. 1 D. 2 此题考察修饰符,函数定义等,故从网上搜罗了下相关资料,总结如下:类、方法、成员变量和局部变量
5、的可用修饰符修饰符类成员访求构造方法成员变量局部变量static (静态的)public (公共的)protected (受保护的)private (私有的)类成员的访问控制符 :即类的方法和成员变量的访问控制符,一个类作为整体对象不可见, 并不代表他的所有域和方法也对程序其他部分不可见,需要有他们的访问修饰符判断。权限如下:访问修饰符同一个类同包不同包,子类不同包,非子类private protected public 默认关于一个 protected的例子 一个容易被忽视的错误 : 一般来说访问控制分 4 种级别: 公开: public 同类 同包 子类 不同包 都可以访问 默认:只向同包
6、同类放开 私有: private 只有类本身可以访问 保护: protected 向子类以及同一个包中的类放开来看一下在该节中的例子 先定义一个 ClassA 并把它放在 mypack1 包中 package mypack1; public class ClassA public int var1; protected int var2; int var3; private int var4; public void method() var1=1; var2=1; var3=1; var4=1; ClassA a = new ClassA(); a.var1=1; a.var2=1; a.v
7、ar3=1; a.var4=1; 然后又在另外一个包mypackage2 中 存在 ClassA 的一个子类ClassC package mypack2; import mypack1.ClassA; class ClassC extends mypack1.ClassA public void method() ClassA a = new ClassA(); a.var1=1; a.var2=1; / 此行出错 实际上这个例子有问题 你会看到 ide(或者编译时)在a.var2=1 这一行报错提示不能访问 protected 对象 这就是 protected 经常被人忽视的地方 尽管 Cl
8、assC 是 ClassA 的一个子类 但是在 ClassC 中创建的是 ClassA 的一个实例 该实例中的 protected 成员变量则很明显没有被ClassC 继承到 自然在 ClassC 中无法访问 var2 所以对于这种情况将代码改为如下,则可以编译通过。package mypack2; import mypack1.ClassA; class ClassC extends mypack1.ClassA public void method() ClassA a = new ClassA(); a.var1=1; super.var2=1; ClassC c = new ClassC(); c.var1=1; c.var2=1;