我已經看到有關保護程序包和程序包專用修飾符之間差異的各種文章。有一件事我這兩個職位Java中的受保護和程序包專用訪問修飾符之間的區別?
Isn't "package private" member access synonymous with the default (no-modifier) access?
在這之間找到矛盾的接受的答案說,
protected修飾符指定的成員只能在其自己的包內訪問(與包私有一樣),另外還有另一個包中的類的子類。
Why the protected modifier behave differently here in Java subclass?
在此接受的答案說,
爲了滿足保護級別的訪問兩個條件必須滿足:
- 的類必須在同一個包。
- 必須有一個繼承關係。
他們不是矛盾嗎?從我對其他文章的理解,第一篇文章給出了正確答案,在其他包中保護== package-private + subclass。
如果這種說法是正確的,那麼爲什麼這個代碼失敗,我的子類貓以下錯誤消息在第17行
The method testInstanceMethod() from the type Animal is not visible
我超和子類代碼如下。
package inheritance;
public class Animal {
public static void testClassMethod() {
System.out.println("The class" + " method in Animal.");
}
protected void testInstanceMethod() {
System.out.println("The instance " + " method in Animal.");
}
}
package testpackage;
import inheritance.Animal;
public class Cat extends Animal{
public static void testClassMethod() {
System.out.println("The class method" + " in Cat.");
}
public void testInstanceMethod() {
System.out.println("The instance method" + " in Cat.");
}
public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = myCat;
myAnimal.testClassMethod();
myAnimal.testInstanceMethod();
}
}
請說明爲什麼上面的代碼失敗。這將是非常有用的。由於
你必須是使用testInstanceMethod()的Cat。 Casting to Animal將對該方法的訪問權限限制在包lavel中,並且由於您的main在不同的包中,代碼將失敗。 (我認爲它甚至不會編譯)。是的,方法在那裏,但你沒有權限訪問它,因爲它是在Animal中被保護的。 – PSIXO
第二個陳述應該被表述爲:*「爲了滿足受保護的級別訪問,**必須滿足**兩個條件之一......」*(另請參閱我在該答案下面做出的評論。) – aioobe