其實Java的protected修飾符,權限定義的很微妙,大致有以下幾種:
(1)protected控制符用於修飾方法和成員變量;
(2)一個類的protected方法或成員變量,在包外是不能通過該類對象進行訪問的,即便在該類的子類中也不可這么做;
在該類包外的子類中能訪問的只是子類自己繼承來的protected 方法和屬性,即可以用super來訪問;
(3)在包外的子類中,不能用另外一個子類的對象訪問父類中的protected變量,盡管這兩個子類繼承自同一個父類;
(4)在包內,則可以;
(5)而對於protected的靜態變量,在子類中可以直接訪問,在不同包的非子類中則不可訪問;
(6)對於protected的用法,其實是遵循了OOP的一個原則,方法和成員變量被繼承后,其可見的范圍只能擴大,不能縮小;
父類:Test.java
package test1;
public class Test {
protected String getNumber() {
return "test";
}
}
package test2;
import test1.Test;
public class ProtectedTest2 extends Test {
public void test1() {
//無法訪問:無法通過父類的引用來訪問
Test test = new Test();
Test test1 = new ProtectedTest2();
// test1.getNumber();
// test.getNumber();
}
public void test2() {
//可以訪問:可以通過繼承的super來訪問,或直接不用super;
getNumber();
super.getNumber();
}
public void test3() {
//可以訪問:通過子類對象來訪問;
ProtectedTest2 pTest2 = new ProtectedTest2();
pTest2.getNumber();
}
public void test4() {
//無法訪問:包外的子類中,不能用另一個子類的對象訪問父類的protected變量,盡管這兩個子類繼承自同一個父類;
ProtectedTest3 pTest1 = new ProtectedTest3();
// pTest1.getNumber();
}
}
不同包的子類ProtectedTest3.java
package test2;
import test1.Test;
public class ProtectedTest3 extends Test{
}
同包的子類ProtectedTest1.java
package test1;
import test2.ProtectedTest3;
public class ProtectedTest1 {
public static void main(String[] args) {
Test test = new Test();
test.getNumber();
//在同包中訪問 和父類不在同一包的子類,可以訪問;
ProtectedTest3 pt = new ProtectedTest3();
pt.getNumber();
}
}
