一个项目有很多类,但是有些类,并不希望被其他类使用。每个类中都有成员和方法,但是并不是每个成员和方法都允许在其他类中调用。如何能做到访问控制呢?就需要使用访问权限修饰符。
Java中的访问权限修饰符有4种,但是仅有3个关键字,因为不写访问权限,在Java中被称为默认权限,或同包权限,本文中以(default)代替。下面按照权限从小到大的顺序对4中访问权限分别介绍。
1.私有权限(private)
private可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类)。被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用。
2.默认权限(default)
类,数据成员,构造方法,方法成员,都能够使用默认权限,即不写任何关键字。默认权限即同包权限,同包权限的元素只能在定义它们的类中,以及同包的类中被调用。
3.受保护权限(protected)
protected可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类)。被protected修饰的成员,能在定义它们的类中,同包的类中被调用。如果有不同包的类想调用它们,那么这个类必须是定义它们的类的子类。
4.公共权限(public)
public可以修饰类,数据成员,构造方法,方法成员。被public修饰的成员,可以在任何一个类中被调用,不管同包或不同包,是权限最大的一个修饰符。
下面我们通过代码进行测试:
我们先定义一个PermissionTest类,并在里面用4种修饰符定义4个方法,然后在本类中进行调用:
package day0709101112_object;
public class PermissionTest {
public void showPublic(){
System.out.println("show-Public.");
}
protected void showProtected(){
System.out.println("show-Protected.");
}
void showDefault(){
System.out.println("show-Default.");
}
private void showPrivate(){
System.out.println("show-Private.");
}
public static void main(String[] args) {
PermissionTest permissionTest = new PermissionTest();
permissionTest.showPublic();
permissionTest.showProtected();
permissionTest.showDefault();
permissionTest.showPrivate();
}
}
输出:
show-Public.
show-Protected.
show-Default.
show-Private.
结论:在本类中,4种修饰符都能访问到。
接下来我们在同一个包中测试子类:
package day0709101112_object;
public class PermissionTest2 extends PermissionTest{
/**
* 同一个包中测试子类
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
PermissionTest2 permissionTest = new PermissionTest2();
permissionTest.showPublic();
permissionTest.showProtected();
permissionTest.showDefault();
//permissionTest.showPrivate();
//The method showPrivate() from the type PermissionTest is not visible
}
}
permissionTest.showPrivate();
报错:
The method showPrivate() from the type PermissionTest is not visible
输出:
show-Public.
show-Protected.
show-Default.
结论:同一个包中的子类,除了private,3种修饰符都能访问到。
接下来我们在同一个包中测试非子类:
package day0709101112_object;
public class PermissionTest3{
/**
* 同一个包中测试非子类
*/
public static void main(String[] args) {
PermissionTest permissionTest = new PermissionTest();
permissionTest.showPublic();
permissionTest.showProtected();
permissionTest.showDefault();
//permissionTest.showPrivate();
//The method showPrivate() from the type PermissionTest is not visible
}
}
permissionTest.showPrivate();
报错:
The method showPrivate() from the type PermissionTest is not visible
输出:
show-Public.
show-Protected.
show-Default.
结论:同一个包中的非子类,除了private,3种修饰符都能访问到。
接下来我们在不同包中测试子类:
package day03_jichu;
import day0709101112_object.PermissionTest;
public class PermissionTest4 extends PermissionTest{
/**
* 不同包中测试子类
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
PermissionTest4 permissionTest = new PermissionTest4();
permissionTest.showPublic();
permissionTest.showProtected();
//permissionTest.showDefault();
//The method showDefault() from the type PermissionTest is not visible
//permissionTest.showPrivate();
//The method showPrivate() from the type PermissionTest is not visible
}
}
permissionTest.showPrivate();报错:
The method showPrivate() from the type PermissionTest is not visible
permissionTest.showDefault();报错:
The method showDefault() from the type PermissionTest is not visible
输出:
show-Public.
show-Protected.
结论:不同包中的子类,除了private、default,其他2种修饰符都能访问到。
接下来我们在不同包中测试非子类:
package day03_jichu;
import day0709101112_object.PermissionTest;
public class PermissionTest5{
/**
* 不同包中测试非子类
*/
public static void main(String[] args) {
PermissionTest permissionTest = new PermissionTest();
permissionTest.showPublic();
//permissionTest.showProtected();
//The method showProtected() from the type PermissionTest is not visible
//permissionTest.showDefault();
//The method showDefault() from the type PermissionTest is not visible
//permissionTest.showPrivate();
//The method showPrivate() from the type PermissionTest is not visible
}
}
permissionTest.showPrivate();报错:
The method showPrivate() from the type PermissionTest is not visible
permissionTest.showDefault();报错:
The method showDefault() from the type PermissionTest is not visible
permissionTest.showProtected();报错:
The method showProtected() from the type PermissionTest is not visible
输出:
show-Public.
结论:不同包中的非子类,只有public修饰符都能访问到。
最后画个图作为总结,铭记于心哈: