[JAVA]对Java的4种访问控制级别的演示

在Java中有4种访问控制级别,分别是Public,Protected,Default,Private;
这四种的访问修饰符的访问权限等级从前到后依次增加。
接下来将用代码依次的展示这四种访问修饰符,在本类(自己本身),子类,同包,不同包的这四种情况下的访问权限。 (学了这么久了,好不容易挤出时间整理一次)

Public (公共访问级别)

在同一包下测试,我们以Package1为例
// Person.java
//主包中的父类
package Package1;
public class Person
{
   public String name;
}

// Student.java
//主包中的子类
package Package1;
public class Student extends Person { }

// TEST.java
//主包中的测试类
package Package1;
public class TEST { 
    public static void main(String[] args) 
    {					
    	Student stu = new Student();		
    	stu.name = "嘿嘿嘿嘿,对吗对吗?";
    	// 验证父类中的public属性继承过来之后是否可以(直接)使用		
    	System.out.println(stu.name);
    	// 输出:嘿嘿嘿嘿,对吗对吗?,验证成功	
    } 
}
在两个不同的包里进行测试
// Person.java
//主包中的父类
package Package1;
public class Person{
   public String name;
}

// Student.java
//主包中的子类
package Package1;
public class Student extends Person { }

//在次包中的测试类
package Package2;
import Package1.Student;
public class TEST { 
    public static void main(String[] args) 
    {					
    	Student stu = new Student();		
    	stu.name = "嘿嘿嘿嘿,对吗对吗?";
    	// 验证父类中的public属性继承过来之后是否可以(直接)使用		
    	System.out.println(stu.name);
    	// 输出:嘿嘿嘿嘿,对吗对吗?,验证成功	
    } 
}
在三个不同的包里进行测试
//在包Package1下的的父类
package Package1;
public class Person {
   public String name;
}

//在包Package2下的的子类
package Package2;
import Package1.Person;
public class Student extends Person {}

//在包Package3下的测试类
package Package3;
import Package2.Student;
public class TEST { 
    public static void main(String[] args) 
    {     
     Student stu = new Student();  
     stu.name = "嘿嘿嘿嘿,对吗对吗?";
     // 验证父类中的public属性继承过来之后是否可以(直接)使用  
     System.out.println(stu.name);
     // 输出:嘿嘿嘿嘿,对吗对吗?,验证成功 
    } 
}
Public : 是公共的,被public所修饰的成员可以在任何类中都能被访问到

NOTICE: public 能用来修饰类,在一个 java 源文件中只能有一个类被声明为 public ,而且一旦有一个类为 public ,那这个 java源文件的文件名就必须要和这个被 public 所修饰的类的类名相同,否则编译不能通过。
By the way,一个类作为外部类的时候只能被 public 或者默认访问修饰符所修饰,但是一个类如果作为内部类的时候,则可以被四种访问修饰符所修饰,因为一个类作为内部类的时候,就作为外部类的一个成员属性了,因此可以有四种访问修饰符修饰,这是内部类和外部类的一个区别。

Protected (子类访问级别)

如果一个类的成员被 protected 访问控制符修饰,那么这个成员既能被同一包下的其他类访问,也能被不同包下该类的子类访问。

在同一包下测试,我们以Package1为例
// Person.java
//主包中的父类
package Package1;
public class Person
{
   protected String name;
}

// Student.java
//主包中的子类
package Package1;
public class Student extends Person { }

// TEST.java
//主包中的测试类
package Package1;
public class TEST { 
    public static void main(String[] args) 
    {					
    	Student stu = new Student();		
    	stu.name = "哎,我太难了";
    	// 验证父类中的protected属性继承过来之后是否可以(直接)使用		
    	System.out.println(stu.name);
    	// 输出:哎,我太难了,验证成功。	
    } 
}
在两个包下测试
// Person.java
//主包中的父类
package Package1;
public class Person{
   protected String name;
}

// Student.java
//主包中的子类
package Package1;
public class Student extends Person { }

//在次包中的测试类
package Package2;
import Package1.Student;
public class TEST { 
    public static void main(String[] args) 
    {					
    	Student stu = new Student();		
    	stu.name = "哎,我太难了";
    	// 验证父类中的protected属性继承过来之后是否可以(直接)使用		
    	System.out.println(stu.name);
    	// 报错: The field Person.name is not visible
    } 
}

这段代码得出在不同包中的非子类(其他类)中是无法直接使用被 protected 修饰的属性的成员。

测试在不同包中的子类使用被 Protected 修饰的属性的使用效果
//主包中的父类
package Package1;
public class Person
{
   protected String name;
}

//次包中的子类
package Package2;
import Package1.Person;
public class Student extends Person 
{ 
	public static void main(String[] args) 
    {					
    	Student stu = new Student();		
    	stu.name = "哎,我太难了";
    	// 验证父类中的protected属性继承过来之后是否可以(直接)使用		
    	System.out.println(stu.name);
    	// 输出:哎,我太难了,验证成功。	
    } 
}

故由该代码可知对于被 protected 修饰的属性,在非本包中的子类中也是可以使用的。But ,需要注意的是:次包中的Student类继承了主包中的name属性之后,他虽然继承过来了但是他本质还是属于非本包属性,所以是不能被非本包的非子类使用的。故在次包中设置的测试类是没有办法直接使用被 protected 修饰的属性的。

Default (包访问级别)

如果一个类或者类的成员不使用任何访问控制符修饰,则称它为默认访问控制级别,这个类或类的的成员只能被本包中的其他类访问。

测试在同一包中的类和类的成员使用被 Default (缺省) 修饰的属性的使用效果
//主包中的父类
// Person.java
package Package1;
class Person
{
   String name;
}

// Student.java
//主包中的子类
package Package1;
class Student extends Person { }

// TEST.java
// 主包中的测试类
package Package1;
public class TEST 
{
	public static void main(String[] args) 
    {					
    	Student stu = new Student();		
    	stu.name = "海龙同学是我好姐妹";
    	// 验证父类中的 default 属性继承过来之后是否可以(直接)使用		
    	System.out.println(stu.name);
    	// 输出:海龙同学是我好姐妹。验证成功。	
    } 
}
测试在不同包中的类的成员使用被 Default (缺省) 修饰的属性的使用效果
//主包中的父类
package Package1;
public class Person
{
   String name;
}

//次包中的子类
package Package2;
import Package1.Person;
public class Student extends Person 
{ 
	public static void main(String[] args) 
    {					
    	Student stu = new Student();		
    	stu.name = "海龙同学是我好姐妹";
    	// 验证父类中的 default 属性继承过来之后是否可以(直接)使用		
    	System.out.println(stu.name);
    	// 报错: The field Person.name is not visible
    } 
}

Privated (当前访问级别)

如果类的成员成员被 privated 访问控制符来修饰,则这个成员只能被 该类的其他成员访问 ,其他类无法直接访问。类的良好封装性就是通过 privated 关键字来实现的。

package Package1;
public class Person 
{
    private String name;
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "海龙哥是我好姐妹";
        //验证在本类中的访问效果
        System.out.println(person.name);
        //输出:海龙哥是我好姐妹,验证成功
    }
}

以下简单的用表格来直观的展现四种访问级别
简单的用表格描述一下
(终于玩完了,四节数据结构实验课和晚上睡觉觉的时间,还真是不容易呢)

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值