アプリ版:「スタンプのみでお礼する」機能のリリースについて

Java アクセス修飾子protectedの範囲について。
別パッケージのクラスを継承してprotectedなメソッドを呼び出す事は不可能ですか?
「同じパッケージ、または継承サブクラスからのみアクセス可能」だそうですが、継承サブクラスでもパッケージが違っていたらダメって事でしょうか?

「Java アクセス修飾子protecte」の質問画像

A 回答 (2件)

もうとっくに試していると思うけど



C:\Users\t-nakamura\java\protected_test>javac ex27\Main.java
ex27\Main.java:6: エラー: printInfo()はBookでprotectedアクセスされます
story.printInfo();
^
エラー1個

64Bit Windows版 jdk11 です。エラーメッセージの日本語が変だけど
継承クラス外からのアクセスは、同じパッケージ内でないと、
駄目ということでしょう。

Book.java
----------
package ex27;
import other.Book;

public class StoryBook extends Book {
public void printInfo() {
super.printInfo();
}
}

とすれば動きます。

面白いのは
Book.java
----------
package ex27;
import other.Book;

public class StoryBook extends Book {
void printInfo() {
super.printInfo();
}
}

はコンパイルエラーになるということ。
protected は package private よりアクセスできる範囲が広いので
アクセスできる範囲を狭める override は エラーになります。

アクセス権の上げ下げが自由な言語もあるので、
わかりにくいですね。
    • good
    • 0

・StoryBookはprintInfoを定義していない(overrideしていない)ので


 MainはStoryBookを通して別パッケージであるBookのprintInfoにアクセスできない。

・StoryBookがprintInfoを定義(override)していれば
 StoryBookと同じパッケージであるMainは、StoryBookのprintInfoにアクセスできる。

ということかな。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!