为了保护程序的安全性,java中设置了三种访问权限修饰词。那么在进行继承时,这些不同的访问权限有什么区别呢?
1.public——接口访问权限:
对于基类(父类,我更喜欢使用基类表示。)中的public的属性和方法,继承它的导出类(子类)都是可以访问的。
2.protected——继承访问权限:
在正常情况下,基类BaseClass中被protected修饰的属性和方法是不能被其它包里面的类所使用的。但是如果其它包中的类DerivedClasses是由这个BaseClass继承而来,那么类DerivedClasses是可以访问类BaseClass里面被Protected修饰的属性和方法。
3.private——你无法访问:
它的定义是:除了包含该成员的类之外,其它任何类都无法访问这个成员。那么在继承的情况下,导出类(子类)也是不能访问基类(父类)中的private的属性和方法。只能使用get和set方法来访问基类中的private成员。
4.包访问权限:
当属性或者方法前面得到权限修饰符是缺省时,表明其能被当前包中的任何类访问,而不能被其他包中的类访问。
可以看出,在继承时,与其它情况差别最大的protected 访问权限修饰词。
这四个访问的权限可以看做是不断访问升级的关系。由最小访问权限的private 不断地扩大访问权限到public。
只能在本类访问(private) —能被本包中其他类访问—》 包访问权限—能被所有继承类访问—》 protected—能在任何类中访问—》public。
下面是基类的代码:
package privateTest;
public class BaseClass {
public String a = "private variable of base class! ";
protected String b = "protected variable of base class!";
private String c = "public variable of base class!";
public void methon1() {
System.out.println("这是基类的public方法!");
}
protected void methon2() {
System.out.println("这是基类的protected方法!");
}
private void methon3() {
System.out.println("这是基类的private方法!");
}
}
下面是同一个包中的继承类:
package privateTest;
public class BerivedClasses extends BaseClass{
//BerivedClasses berivedClasses = new BerivedClasses();
public static void main(String[] args) {
BerivedClasses berivedClasses = new BerivedClasses();
berivedClasses.test1();
}
public void test1() {
System.out.println(super.a); //public 可以访问。
System.out.println(super.b); //protected 可以访问
System.out.println(super.c); //private 错误: The field BaseClass.c is not visible
super.methon1(); //public 可以访问。
super.methon2(); //protected 可以访问
super.methon3(); //private The method methon3() from the type BaseClass is not visible
}
}
下面是不同包中的继承类:
package differentPackage;
import privateTest.BaseClass;
public class DifferentPackageClass extends BaseClass{
public static void main(String[] args) {
DifferentPackageClass differentPackageClass = new DifferentPackageClass();
differentPackageClass.test1();
}
public void test1() {
System.out.println(super.a); //public 可以访问。
System.out.println(super.b); //protected 错误: The field BaseClass.b is not visible
System.out.println(super.c); //private 错误: The field BaseClass.c is not visible
super.methon1();
super.methon2(); //protected 可以访问!!
super.methon3(); //private 错误: The method methon3() from the type BaseClass is not visible
//如果在子类中使用父类对象来访问时,也是不能访问父类中的protected的成员的!!!!!!
BaseClass baseClass = new BaseClass();
System.out.println(baseClass.a); //public 可以访问。
System.out.println(baseClass.b); //protected 错误: The field BaseClass.b is not visible
System.out.println(baseClass.c); //private 错误:The field BaseClass.c is not visible
baseClass.methon1(); //public 可以访问。
baseClass.methon2(); //protected 错误:The method methon2() from the type BaseClass is not visible
baseClass.methon3(); //private 错误: The method methon3() from the type BaseClass is not visible
}
}
class DifferentPackageClass2{
public void test2() {
BaseClass baseClass = new BaseClass();
System.out.println(baseClass.a); //public 可以访问。
System.out.println(baseClass.b); //protected 错误: The field BaseClass.b is not visible
System.out.println(baseClass.c); //private 错误: The field BaseClass.c is not visible
}
}
注意,代码中的错误部分没有删除和修改。