JavaSE:3min讲解权限修饰符

来源:互联网 发布:办公网络解决方案 编辑:程序博客网 时间:2024/05/17 09:20

一个项目有很多类,但是有些类,并不希望被其他类使用。每个类中都有成员和方法,但是并不是每个成员和方法都允许在其他类中调用。如何能做到访问控制呢?就需要使用访问权限修饰符。

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 stubPermissionTest2 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 stubPermissionTest4 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修饰符都能访问到。


最后画个图作为总结,铭记于心哈:




0 0
原创粉丝点击