Java——访问控制(概念理解+应用举例)

1.关于Java中的访问控制

Java语言中,通过访问(权限)控制符来隐藏类中的具体实现。类不但将数据结构和对数据结构进行的访问和操作进行类封装;而且对封装后的成员通过访问控制符,该隐藏的隐藏,该暴露的暴露。达到访问的安全性、类的可维护性、类数据的完整性。
通过访问控制符可以实现良好的类封装。访问控制符与继承无关,即不可以继承。

访问控制的三个原因: 访问安全、可维护性、数据的完整性。在类中可以出现访问控制符的三处单元:①类的声明;② 方法的声明;③字段的声明。

在Java中,一共有四类访问控制符,分别是publc、protected、默认(default、friendly)和private。

这四者的访问级别从高到低依次是:publc > 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的博友们,感谢感谢!!!😀😀😀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章