Java提供了4种访问控制级别

  • private
  • 不加任何拜访控制符的访问控制级别(default)
  • protected
  • public

从上到下,访问控制级别由小到大。

权限介绍

  • private:以后类拜访权限。如果类中的成员(包含属性、办法和结构器等)应用private拜访控制符来润饰,则这个成员只能在以后类的外部被拜访。
  • default:包拜访权限。如果类中的成员(包含属性、办法和结构器等)或者一个外部类,不必任何拜访控制符润饰,咱们就称它是包拜访权限。default访问控制的成员或外部类能够被雷同包下的其余类拜访。
  • protected:子类拜访权限。如果类中的成员(包含属性、办法和结构器等)应用protected拜访控制符来润饰,则这个成员即能够被同一个包中的其余类拜访,也能够被不同包中的子类拜访。
  • public:公共拜访权限。这是一个最宽松的访问控制级别。如果类中的成员(包含属性、办法和结构器等)或者一个外部类,应用public拜访控制符来润饰,那么这个成员或者外部类就能够被所有类拜访,不论拜访类和被拜访类是否处于同一个包中,不论是否具备父子继承关系。

外部类只能有两种访问控制级别:public和默认default。外部类不能应用private和protected润饰。因为外部类没有处于任何类的外部,也就没有所在类的外部、所在类的子类两个范畴。因而,private和protected拜访控制符对外部类没有意义。

拜访级别管制表

privatedefaultprotectedpublic
同一个类中
同一个包中
子类中
全局范畴内

下面表格横向(每行)比拟

比方:有3个类,C1,C2,C3。

  • 其中C1和C2在同一个包下
  • C3和C2不在一个包下,且C3继承了C2,即,C3是C2的不同包下的子类。
  • 在同一个类中,C2拜访本类中的属性、办法和默认类。都可拜访

      //C2类  package com.study.demo1;  public class C2 {      private int a;      int b;      protected int c;      public int d;      private void test1(){      }      void test2(){      }      protected void test3(){      }      public void test4(){      }      public static void main(String[] args) {          C2 c2 = new C2();          c2.a = 1;          c2.b = 2;          c2.c = 3;          c2.d = 4;          c2.test1();          c2.test2();          c2.test3();          c2.test4();          T t = new T();      }  }  //没有任何拜访控制符润饰的类  class T{  }
  • 在同一个包中,C1拜访C2中的属性、办法和默认类。除了private拜访控制符润饰的属性或办法,其余拜访控制符润饰的,都可拜访。

     //C1类  package com.study.demo1;  public class C1 {      public static void main(String[] args) {          //类C1与类C2在同一个包内          C2 c2 = new C2();        //c2.a = 1;//编译报错          c2.b = 2;          c2.c = 3;          c2.d = 4;        //c2.test1();//编译报错          c2.test2();          c2.test3();          c2.test4();          T t = new T();      }  }
  • 子类中,C3和C2不在一个包下,且C3继承了C2,即,C3是C2的不同包下的子类。子类中,只能拜访父类中的protected和public拜访控制符润饰的属性和办法。

      package com.study.demo2;  import com.study.demo1.C2;  public class C3 extends C2 {      public static void main(String[] args) {          //类C3继承类C2          //即类C3是类C2的子类          C3 c3 = new C3();        //c3.a = 1;//编译报错        //c3.b = 2;//编译报错          c3.c = 3;          c3.d = 4;        //c3.test1();//编译报错        //c3.test2();//编译报错          c3.test3();          c3.test4();        //T t = new T();//编译报错      }  }
  • 全局范畴类,public拜访控制符润饰的属性、办法能够被全局拜访。