成员属性的访问权限(public,包访问,protected,private)和有package的java文件的编译方式的简要探究
先说结论:
- 同一个包内,不能访问包中其他类的private成员
- 不同的包中,没有继承关系,只能访问其它包中的类的public成员
- 子类不同包,可以访问其它包中父类的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
扫描二维码关注公众号,回复:
8609601 查看本文章
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成员,要通过继承下来来访问才行