天天看點

java protected用法_深入了解Java的protected修飾符

其實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();

}

}