Java提供了三种访问控制权限public protected private。故名思议访问权限,就是外部的能能不能访问,在继承的时候还要考虑能不能被继承。
Private :当前类的访问权限,如果是类中的成员被private修饰则该成员只能在该类中被访问调用,外部是不能访问的,很显然用private能够更好的隐藏数据或者方法。在继承中如果父类有private的访问权限,子类也无法访问,更不能被继承和重写此方法,如果子类定义一个与父类完全相同的该方法其依然不是重写,只是在子类中重新定义了一个新方法而已。
Protected:这个访问权限很多人都不是很理解,对于初学的人来说基本上是不会使用。用protected修饰的成员既可以在该类中被访问,也可以在相同的包下的其他类或者对象访问和不同包里面的子类访问。一般的使用protected修饰是希望子类能够重写该方法。
public:这个大家应该相当熟悉了。访问权限最大。
例子:
在 package one 中写二个类 tes,Vtest
public classtest {
public void info(){
System.out.println("这里执行的是test的info()");
}
protected void infoTest(){
System.out.println("test保护性成员的测试");
}
}
public classVtest extends test{
public void info(){
super.info();
System.out.println("这里执行的是Vtest的info()函数");
}
public static void main(String[] args){
Vtest t = new Vtest();
t.info();
t.infoTest();
System.out.println("***************************");
test t1 = new test();
t1.info();
t1.infoTest();
}
重执行的结果:
这里执行的是test的info()
这里执行的是Vtest的info()函数
test保护性成员的测试
***************************
这里执行的是test的info()
test保护性成员的测试
从结果来看,在同一个包下面 test的对象和继承的子类对象都可以访问protected的成员。同样读者可以验证,在不同的包子类和其它的类都不能够访问protected修饰的成员。
我们从继承的角度来看:protected修饰的成员可以被继承。从上面的运行结果来看Vtest是继承了父类test的infoTest()的方法,从运行的结果也可以看出来。为了能够更好的理解,我们新建一个包,取名为two,新建类Ftest
public classFtest extends test{
public static void main(String[] args){
Ftest t = new Ftest();
t.infoTest();
}
}
运行的结果:
test保护性成员的测试
子类重写父类方法中有这样一个规定:子类方法的访问权限应该比父类的访问权限大,这一规定就是为protected定做的,private不能被继承,public已经达到最大的权限,只有protected权限还可以扩大。修改Ftest类,重写infoTest()
public classFtest extends test{
public void infoTest(){
super.infoTest();
System.out.println("Ftest中重写了infoTest()");
}
public static void main(String[] args){
Ftest t = new Ftest();
t.infoTest();
}
父类中infoTest()的访问权限是protected,子类中的权限扩大了成了public。运行的结果:
test保护性成员的测试
Ftest中重写了infoTest()