聲明和訪問控制
保護和默認成員(protected)
1、保護和默認訪問控制級別幾乎完全相同,但只有一點主要區別,只有當訪問默認成員的類屬於同一個包時,才能訪問默認成員。而對於protected類成員而言,只要繼承了父類,即使子類位於不同的包中,該子類也能訪問它。而默認則不同,如果在不同的包中就無法訪問。
例如:
package parent;
public class Parent{
protected int x = 10;
}
package child;
class Child extends Parent{
public void testIt(){
System.out.println("x is:" + x);
}
}
這個Child類通過繼承訪問這個保護變量,無論何時當子類訪問父類成員時,都是在談論子類繼承成員,而不是通過父類的引用訪問該成員。
如果把上面的代碼改成
Parent p = new Parent();
System.out.println(p.x);
這樣將會報錯
包外子類能繼承保護成員,並且包外子類不能使用父類引用訪問保護成員,對於包外子類,只能通過繼承來訪問保護成員。
2、倘若包外子類,例如剛剛的Child類,如果和Child類在同一個包下有一個Child2類,那麽如果該Child2類有Child類的引用,並且訪問變量x,那麽此時將會報錯。因為子類一旦繼承了保護成員,該保護成員對這一子類的任何代碼都便成為了私有的了。那麽即使Child2與Child在同一個包下,Child2也不能訪問該繼承的變量。
3、private public protected這樣的訪問修飾符是用來修飾成員變量的而不能修飾局部變量,事實上只有一個修飾符final能用來修飾局部變量。
class Foo{
void doSomething(){
private int x = 7;
this.otherMethod(x);//這樣是錯誤的
}
}
聲明和訪問控制