1.关于Java中的访问控制
Java语言中,通过访问(权限)控制符来隐藏类中的具体实现。类不但将数据结构和对数据结构进行的访问和操作进行类封装;而且对封装后的成员通过访问控制符,该隐藏的隐藏,该暴露的暴露。达到访问的安全性、类的可维护性、类数据的完整性。
通过访问控制符可以实现良好的类封装。访问控制符与继承无关,即不可以继承。访问控制的三个原因:访问安全、可维护性、数据的完整性。在类中可以出现访问控制符的三处单元:①类的声明;②方法的声明;③字段的声明。
在Java中,一共有四类访问控制符,分别是public、protected、默认(default、friendly)和private。
这四者的访问级别从高到低依次是:public > protected > 默认(default、friendly)> private。见下图👇👇👇
低依次是:public > protected > 默认(default、friendly) > private。见下图👇👇👇
那么既然说到了访问控制,就不仅仅是对类来说,同时也会涉及到包,在之前的博文中也讲到过,Java中的包其实就是一个文件夹,但是包实际上也是一个访问控制的逻辑单元:库单元。见下图👇👇👇
2.四类访问控制符的作用域
· 2.1 public
public定义的为公共属性或方法,任何地方都可以进行访问!!!
· 2.2 protected
protected定义的为受保护的属性或方法,同一个包中的类可以进行访问,不同包中的子类也可以进行访问!!!
2.3 默认(包的访问权限)
默认(default、friendly)定义的为缺省属性或方法,同一个包中的类可以进行访问,不同包中的类无法进行访问!!!
2.4 private
private定义的为私有属性或方法,只有在包含private对应的类中才可以进行访问,类外无法进行访问!!!
3.访问控制符的使用原则
考虑到安全性、可维护性、完整性以及高内聚低偶合,尽可能使用低级别的访问控制符。
访问控制符从高到低的级别(范围):public、protected、默认、private。
应尽可能地总是将字段指定为 private,减少类间数据结构耦合;否则,将产生高耦合,耦合的数据结构不具有可维护性。类中的方法实现与访问控制符无关,总是隐藏的,具有可维护性。
下面,我们举几个例子,来更好的理解这四类访问控制符!!!👇👇👇
Example 1:同一个包下的访问
我们首先创建一个包,包名为:p1,并且在这个包下创建三个类文件,分别为公共类MyClass1、(默认)缺省类MyClass2以及包含main方法的公共类Test,详细内容请看下面的代码:👇👇👇
package p1; public class MyClass1 { public int a=5; private int b=10; protected int c=20; int d=30; public void func1() { System.out.println("func1"); } private void func2() { System.out.println("func2"); System.out.println(b); } protected void func3() { System.out.println("func3"); } void func4() { System.out.println("func4"); } }
package p1; class MyClass2 { public void func1() { System.out.println("func1 of MyClass2"); } }
package p1; public class Test { public static void main(String[] args) { MyClass1 obj1=new MyClass1(); System.out.println(obj1.a);//a是公共属性,任何地方都可以访问 //System.out.println(obj1.b);//本行代码会报错!!!b是私有属性,类MyClass1外无法访问 System.out.println(obj1.c);//c是受保护属性,同一个包下的类可以访问,其他包中的子类也可以访问 System.out.println(obj1.d);//d是缺省属性,同一个包下的类可以访问 //所谓缺省,就是指系统默认的方法 obj1.func1();//func1()是公共方法,任何地方都可以访问 //obj1.func2();//func2()为私有方法,类MyClass1外无法访问 obj1.func3();//func3()是受保护方法,同一包中的类可以访问,其他包中的子类也可以访问 obj1.func4();//func4()是缺省方法,同一包中的类可以访问 MyClass2 obj2=new MyClass2(); obj2.func1();//同一个包中的缺省访问控制类可以进行访问 } }
在第一块代码中,我们分别定义这四类访问控制符对应的属性及方法,并且为其赋值。
在第二块代码中,仅仅是定义了一个缺省类,以及一个公共方法。
在最后这个代码块中,我们利用前文对访问控制符的理解,来创建对应的类对象,用对象来调用这些属性及方法。
(详细的注释,我已经写在代码中了,大家可以仔细理解),下面是程序运行的结果:👇👇👇
Example 2:不同包之间的非继承访问
我们在第一个例子的基础上,再新创建一个包,包名为:p2,在这个包下,我们首先使用 import p1.MyClass1; 来将包p1中的公共类MyClass1进行导入,而缺省类MyClass2就无法进行导入,原因是:缺省类在对应包外不可见!!!之后,我们在包p2下,创建一个包含main方法的类文件Test,详细内容大家来看下面的代码:👇👇👇
package p2;//不同包间的非继承访问 import p1.MyClass1; //import p1.MyClass2;报错!!!不能导入不同包中的缺省类,缺省类在对应包外不可见 public class Test { public static void main(String[] args) { MyClass1 obj1=new MyClass1(); System.out.println(obj1.a);//a为公共属性,任何地方都可以访问 //System.out.println(obj1.b);//报错!!!b为私有属性,类外无法访问 //System.out.println(obj1.c);//报错!!!c是受保护属性,不同包中的非子类无法访问 //System.out.println(obj1.d);//报错!!!d是缺省属性,不同包中的类不能访问 obj1.func1();//func1()是公共方法,任何地方都可以访问 //obj1.func2();//报错!!!func2()为私有方法,类外无法访问 //obj1.func3();//报错!!!func3()为受保护方法,不同包中的非子类无法访问 //obj1.func4();//报错!!!func4()是缺省方法,不同包中的类不能访问 //MyClass2 obj2=new MyClass2();//报错!!!不可以访问不同包中的缺省类 } }
代码的解释,我也已经将注释写的挺清楚的了,大家可以参考着理解一下,下面是程序的运行结果:👇👇👇
Example 3:不同包之间的继承访问
第三个例子中,我们同样是在第一个例子的基础上,再新创建一个包,包名为:p3,那么在这个包下,我们仍然是先使用 import p1.MyClass1; 来将包p1中的公共类MyClass1进行导入,而缺省类MyClass2就无法进行导入,原因是:缺省类在对应包外不可见!!!之后,我们在包p3下,创建一个包含main方法的类文件Test,但是这里我们使用类Test去继承包p1中的类MyClass1。详细内容,我们来看下面的代码:👇👇👇
package p3;//不同包间的继承访问 import p1.MyClass1; //import p1.MyClass2;报错!!!不能导入不同包中的缺省类,缺省类在对应包外不可见 public class Test extends MyClass1 { public static void main(String[] args) { Test obj1=new Test(); System.out.println(obj1.a);//a为公共属性,任何地方都可以访问 //System.out.println(obj1.b);//报错!!!b为私有属性,类外无法访问 System.out.println(obj1.c);//c为受保护属性,不同包中的子类可以访问 //System.out.println(obj1.d);//报错!!!d是缺省属性,不同包中的类不能访问 obj1.func1();//func1()为公共方法,任何地方都可以访问 //obj1.func2();报错!!!func2()是私有方法,类外无法访问 obj1.func3();//func3()为受保护方法,不同包中的子类可以访问 //obj1.func4();//func4()为缺省方法,不同包中的类无法访问 } }
在这里,我们的类Test继承了类MyClass1,所以不仅仅是public定义的公共属性及方法可以访问,而且protected定义的受保护的属性及方法,也可以在其他包中的子类下进行访问,大家可以理解一下代码中的注释。程序的运行结果如下:👇👇👇
那么,以上就是博主总结的Java语言中访问控制的相关内容,其实主要就是那四个访问控制符的理解和使用,博文中也许会有表达不严谨之处、又或是错误,也希望大家可以指出纠正,感谢CSDN的博友们,感谢感谢!!!😀😀😀