其實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";
}
}
不同包的子類:ProtectedTest2.java
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();
}
}