深入理解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();

	}
}




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM