protected的使用范圍
類NewObject中有protected修飾的方法或者屬性,則:
-
同一個包中:
- 可在同一個包里的子類中實例化
NewObject
類獲得對象,然后可用該對象訪問protected修飾的方法或者屬性,即.
操作訪問。 - 可在同一個包里的非子類中實例化
NewObject
類獲得對象,然后可用該對象訪問protected修飾的方法或者屬性。 - 可在同一個包里的非子類中實例化
NewObject
類的子類(該子類和NewObject
類在同一個包中)獲得對象,然后可用該對象訪問protected修飾的方法或者屬性。 - 可在同一個包里的
NewObject
類的子類中調用NewObject
類中protected修飾的方法或者屬性,即protected修飾的方法和屬性可被同一個包中的子類繼承。
- 可在同一個包里的子類中實例化
-
非同一個包中:
- 可在非同一個包里的子類中實例化
NewObject
類獲得對象,但無法用該對象問protected修飾的方法或者屬性。 - 可在非同一個包里的非子類中實例化
NewObject
類獲得對象,但無法用該對象問protected修飾的方法或者屬性。 - 可在非同一個包里的非子類中實例化
NewObject
類的子類(該子類和NewObject
類不在同一個包中)獲得對象,但無法用該對象問protected修飾的方法或者屬性。 - 可在非同一個包里的
NewObject
類的子類中調用NewObject
類中protected修飾的方法或者屬性,即protected修飾的方法和屬性可被不同一個包中的子類繼承。
- 可在非同一個包里的子類中實例化
package 1:
-
BaseClass
:package package_1; // 相當於NewObject類 public class BaseClass { // protected方法 protected void protectedMethod() { System.out.println("This is BaseClass"); } }
-
SubClass
:package package_1; public class SubClass extends BaseClass { }
-
MainClass
:package package_1; public class MainClass { public static void main(String[] args) { BaseClass b1 = new BaseClass(); SubClass s1 = new SubClass(); b1.protectedMethod(); // 父類的protected方法可在同一個包中的其它類中被訪問 s1.protectedMethod(); // 子類中繼承了父類的protected方法 } }
package 2:
-
SubClass
:package package_2; import package_1.BaseClass; // 繼承了不在同一個包中的父類 BaseClass public class SubClass extends BaseClass { public void testMesthod(){ BaseClass b1 = new BaseClass(); b1.protectedMethod(); // 編譯器報錯。父類的protected方法不可以在不同一個包中的子類中被訪問 this.protectedMethod(); // 子類繼承了父類protected方法 } }
-
MainClass
:package package_2; import package_1.*; public class MainClass { public static void main(String[] args) { BaseClass b1 = new BaseClass(); b1.protectedMethod(); // 編譯器報錯。父類的protected方法不可以在不同一個包中的其它類中被訪問 SubClass s1 = new SubClass(); s1.protectedMethod(); // 編譯器報錯。子類的protected方法不可以在不同一個包中的其它類中被訪問 } }