01. Java基础之访问权限

         Java的访问权限就四种,public > 包访问权限(默认访问权限)> protected > private。用一张表来总结各个权限的用法:

Access Levels
ModifierClassPackageSubclassWorld
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 }
View Code

(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 }
View Code

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 }
View Code
原文地址:https://www.cnblogs.com/Hermioner/p/9482342.html