Java的访问权限就四种,public > 包访问权限(默认访问权限)> protected > private。用一张表来总结各个权限的用法:
Modifier | Class | Package | Subclass | World |
---|---|---|---|---|
public |
Y | Y | Y | Y |
protected |
Y | Y | Y | N |
no modifier | Y | Y | N | N |
private |
Y | N | N | N |
class代表的当前类,pckage代表的当前包,subclass代表子类,world代表除开前三种情况的其它情况。
解释:
(1)public:任意访问
(2)protected:可以当前类;同包中的所有类;不同包的子类都可以调用父类中的protected修饰的方法或者变量; 但是不同包,只可以用子类来访问父类的Protected, 却不可以用父类本身来访问Protected,除非加super来调用父类。
1 package com.test.b; 2 3 public class A{ 4 public A() { 5 System.out.println("A construtor"); 6 } 7 protected void f() 8 { 9 System.out.println("A.f()"); 10 } 11 12 } 13 14 15 package com.test.c; 16 17 import com.test.b.A; 18 19 public class B extends A{ 20 21 public void test() 22 { 23 super.f();//ok 24 A a=new A(); 25 f();//OK 26 a.f();//编译错误,无法跨包用父类的对象访问Protected 27 } 28 public static void main(String args[]) 29 { 30 31 32 } 33 34 }
(3)no modifier:默认是包访问权限。就是只有本包的所有类才可以访问这个类中的数据或方法。
(4)private:只有当前类才有资格访问变量或者方法。
note1:父类的构造器如果是private的,那么子类的对象无法创建成功的。因为子类对象创建的时候会默认调用父类构造函数。
1 package com.test.a; 2 3 public class A { 4 private A() 5 { 6 System.out.println("A constructor"); 7 } 8 } 9 10 11 package com.test.a; 12 13 public class C extends A{ 14 public C() 15 { 16 //默认是会调用父类的构造器,但是父类的构造器是private,因此子类也会compile error 17 } 18 19 }
note2:父类的private方法和属性不能被子类访问,也不能在子类中被访问
1 package com.test.a; 2 3 public class A { 4 private int m=3; 5 private void f() 6 { 7 System.out.println("A.f()"); 8 } 9 } 10 11 12 package com.test.a; 13 14 public class C extends A{ 15 public static void main(String args[]) 16 { 17 A a=new A(); 18 System.out.println(a.m);//编译错误。 19 System.out.println(a.f());//编译错误 20 C c=new C(); 21 System.out.println(c.m);//编译错误 22 } 23 }