Java public,包访问,protected,private

成员属性的访问权限(public,包访问,protected,private)和有package的java文件的编译方式的简要探究


先说结论:

  1. 同一个包内,不能访问包中其他类的private成员
  2. 不同的包中,没有继承关系,只能访问其它包中的类的public成员
  3. 子类不同包,可以访问其它包中父类的protected和public成员

注意:子类和父类不同包,访问父类的protected成员,有一些特殊哦:实际上子类是不能访问不同包下父类的protected成员的,但是子类继承了父类的成员(而我们 通常所说的子类可以访问不同包下父类的protected成员是指,子类访问的是继承自父类的protected成员


下面是对上述4个结论的探究过程,感兴趣的可以看一看

首先:

一个文件夹(D:\zgh\desktop\Java代码练习\Demo)下四个java文件:
在这里插入图片描述
ClassA.java

package mypack1;

public class ClassA{
	public int var1;
	protected int var2;
	int var3;
	private int var4;
}

ClassB.java

package mypack1;

class ClassB
{
	public static void main()
	{
		ClassA a=new ClassA();
		a. var1 =10; 
		a. var2 =20; 
		a. var3 =30;
		a. var4 =40;
	}	
}

ClassC.java

package mypack2;
import mypack1.ClassA;

class ClassC
{
	public static void main()
	{ 
		ClassA a=new ClassA();
		a. var1 =10; 
		a. var2 =20; 
		a. var3 =30; 
		a. var4 =40; 
		}
}

ClassD.java

package mypack2;
import mypack1.ClassA;

class ClassD extends ClassA
{
	public static void main()
	{
		ClassA a=new ClassA();
		a. var1 =10; 
		a. var2 =20; 
		a. var3 =30; 
		a. var4 =40; 
		}
}

它们的关系如图:
在这里插入图片描述

开始编译ClassA.java

ClassA.java 编译:
在这里插入图片描述
编译成功:
在这里插入图片描述
然后mypack1文件夹中:

在这里插入图片描述

然后开始编译ClassB.java
在这里插入图片描述
很显然,同一个包内,不能访问包中其他类的private成员

把ClassB.java的代码稍微改动一下:

package mypack1;

class ClassB
{
	public static void main()
	{
		ClassA a=new ClassA();
		a. var1 =10; 
		a. var2 =20; 
		a. var3 =30;
		//a. var4 =40; //var4是ClassA的private成员
	}
}

再编译:
在这里插入图片描述
在这里插入图片描述

然后开始编译ClassC.java
在这里插入图片描述
不同的包中,没有继承关系,只能访问其它包中的类的public成员
改动一下ClassC.java的代码:

package mypack2;
import mypack1.ClassA;


class ClassC
{
	public static void main()
	{ 
		ClassA a=new ClassA();
		a. var1 =10;       //ClassA的public成员
		//a. var2 =20;     //ClassA的protected成员
		//a. var3 =30;     //ClassA的包访问成员
		//a. var4 =40;    //ClassA的private成员
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再多探究一点,package语句一定是在文件的第一个语句(不包括注释)

看代码:

import mypack1.ClassA;

package mypack2; //package语句没放在第一句

class ClassC
{
	public static void main()
	{ 
		ClassA a=new ClassA();
		a. var1 =10;     //ClassA的public成员
		//a. var2 =20;     //ClassA的protected成员
		//a. var3 =30;     //ClassA的包访问成员
		//a. var4 =40;    //ClassA的private成员
	}
}

报错了:
在这里插入图片描述

开始编译ClassD.java
在这里插入图片描述

子类不同包,可以访问其它包中父类的protected和public成员,但是为什么protected成员的也报错了呢?因为protected成员的访问方式不是这样

改动一下ClassD.java的代码:

package mypack2;
import mypack1.ClassA;

class ClassD extends ClassA
{
	public static void main()
	{ 
		ClassA a=new ClassA();
		a. var1 =10; 
		//a. var2 =20;       //ClassA的protected成员
		//a. var3 =30;     //ClassA的包访问成员
		//a. var4 =40;    //ClassA的private成员; 

		ClassD d = new ClassD();
		d.var2 = 20;
	}
}
//访问其它包中父类的protected成员,要通过继承下来来访问才行

在这里插入图片描述
在这里插入图片描述

发布了150 篇原创文章 · 获赞 267 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/Zhangguohao666/article/details/103438128