假設我們有兩個包p1
和p2
和p2.M12
擴展類p1.M1
如下:爲什麼包保護方法在同一個包中不可見?
package p1;
public class M1 {
void method1() {
System.out.println("Method 1 called");
}
}
package p2;
import p1.M1;
public class M12 extends M1 {
void method2() {
System.out.println("Method 2 called");
}
}
讓我們延長M12
與p2.B
:
package p2;
public class B extends M12 {
public void doSomething() {
method1();
method2();
}
}
這給出了一個編譯錯誤作爲method1
,是套餐的p1
內的保護在p2
中不可見。 method2
顯示沒有問題。
現在讓我們來延長p2.M12
與p1.A
:
package p1;
import p2.M12;
public class A extends M12 {
public void doSomething() {
method1();
method2();
}
}
在這裏我得到一個編譯錯誤,兩個method2()
(這是可以理解的)和method1()
:
我的問題是:爲什麼是method1
,它在封裝中受封裝保護p1
在類別A
中不可見,來自同一封裝p1
?
這意味着一個孩子的班級會比其父母看到的多。這聽起來很奇怪。 – luk2302
@ luk2302這個軟件包保護的方法不在包中,也很奇怪。 – lexicore
這是我設法找到的JLS中最相關的部分:https://docs.oracle.com/javase/specs/jls/se9/html/jls-15.html#jls-15.12.4.3 –