JavaSE:3min讲解权限修饰符

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

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


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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值