Java中的权限修饰符的访问范围详解
Java*有四个权限修饰符,分别是private, default(表示不写), protected, public,访问权限范围由小到大。下面我们分别介绍权限修饰符修饰类、修饰成员修饰构造器的情况。
一、修饰类
修饰类只有两个权限修饰符:public和default
- public:全局访问
- default:表示不写修饰符的情况,只能在同包中访问
下面我们进行测试:
1.创建两个包,取名为com.syc.test和com.syc.input,然后在com.syc.test下创建Test类、Woman类,com.syc.input下创建People类
2.编写代码。people.java文件的内容如下:
package com.syc.input;
public class People {
}
class Man{
}
Test类的内容如下:
package com.syc.test;
import com.syc.input.People;
public class Test {
public static void main(String[] args){
new People();//跨包时需要导包
// new Man();//错误,表示default修饰的类不能跨包访问
new Woman();
}
}
Woman类的内容如下:
package com.syc.test;
class Woman {
}
3.测试并总结:我们用Test类中的main方法进行测试,发现创建People对象是可以直接new出来的(Public全局访问),但是Man对象却无法创建,而Woman对象也是可以new出来(default只能在同包中访问)。
二、修饰成员
权限修饰符修饰成员的访问范围如下图所示:
我们按照权限由小到大的顺序来测试修饰符。
1.测试private
我们新创建一个项目,然后创建包com.syc.test,在其中新建一个类People
编写People的代码如下:
package com.syc.test;
public class People {
//访问权限由小到大定义成员变量
private int a = 10;
int b = 20;
protected int c = 30;
public int d = 40;
//访问权限由小到大定义成员方法
private void fun1(){
}
void fun2(){
}
protected void fun3(){
}
public void fun4(){
}
public static void main(String[] args) {
//本类当中访问成员变量和成员方法,先创建这个类的对象
People p = new People();
System.out.println(p.a);//私有的权限最低的都能访问,其他权限高的一定能访问
p.fun1();
}
}
可以看到在本类中,权限最小的都能访问到,其他三个就必定能够访问了。
2.测试default
我们继续在com.syc.test包中创建新的类Test,然后对成员变量进行测试,发现在使用p.只弹出了bcd,可见私有成员a无法脱离其所属类进行访问。
Test类的代码如下:
package com.syc.test;
public class Test {
public static void main(String[] args) {
People p = new People();
// System.out.println(p.a);//提示错误,private修饰的成员不能在其类外访问到
System.out.println(p.b);
p.fun2();
}
}
当我们跨包时,只能查看到public所修饰的成员(此时没有继承):
3.测试protected
protected修饰的成员能在本类,同包,子类中被访问。
我们在com.syc.input中新建Student类,使这个类继承自People,然后我们可以看到能访问到父类的protected 成员c。
public就不用说了,全局能访问,如上上图(未继承时)能访问到public成员d。
三、修饰构造器
权限修饰符修饰构造器的访问范围与修饰成员时候访问范围相同。
1.测试private
和测试成员一样,我们新建一个项目,然后创建com.syc.test包,在其中添加People类,然后添加四个构造器(需要添加不同类型的参数来对构造器重载),并在本类中用main方法进行测试,发现四个构造器均能使用。
package com.syc.Test;
public class People {
private People(){
}
People(int a){
}
protected People(char c){
}
public People(String s){
}
public static void main(String[] args) {
new People();
new People(1);
new People('c');
new People("syc");
}
}
2.测试default
我们在com.syc.Test包下新建Test类,发现不能访问无参的私有构造器(private People(){})。
3.测试public
我们新建一个包com.syc.input,也创建一个类Test,此时在main方法中测试,发现只能访问public方法修饰的构造器(public People(String s){})
上一篇: java实现微信扫码支付功能
下一篇: Java设计模式—单例模式以及权限修饰符