限定しりとり

protectedの場合、自分のクラスか継承されたクラスへのアクセスしかできないと思い、エラーが出るプログラムを書いたつもりでしたが、コンパイルし、実行結果も123が表示されました。

予想では、private, protectedがエラーで、デフォルト、publicだとうまくいくとおもっていましたが、protectedでアクセスできた理由がわかりません。
どなたか、おしえていただけますでしょうか?

なお、JDKは1.8.0_77です。

<実行結果>
E:>javac test.java
E:>java test
123

<プログラム>

class abc{
protected int a = 123;
}

class test{
public static void main(String[] str){
abc o = new abc();
System.out.println(o.a);
}
}

A 回答 (3件)

protectedは、クラス内、継承されたクラス内以外にも、同一パッケージ内からのアクセスも可能です。

質問文のプログラムでは、abcクラスもtestクラスも同一パッケージ(パッケージ無し)ですので、エラーとなりません。

もし、protectedでクラス外からアクセスしようとしてエラーになることを確認したい場合は以下のようにする必要があります。

<ソースファイル a¥abc.java>
package a;

class abc{
protected int a = 123;
}

<ソースファイル b¥test.java>
package b;

import a.*;

class test{
public static void main(String[] str){
abc o = new abc();
System.out.println(o.a);
}
}

<コンパイル方法>
javac a¥abc.java
javac b¥test.java

上記の2行目のjavacの実行時にprotectedのためにエラーとなります。
    • good
    • 0
この回答へのお礼

teideさん、早速の回答ありがとうございます。
パッケージについて理解でき、結果についても納得しました。
今読んでいる本で、80ページ後に解説がありました。

お礼日時:2016/03/31 17:00

Javaの仕様通り。



同一パッケージ内では実装詳細にアクセスできた方が
何かと便利だからです。
C++のfriendより楽。
    • good
    • 0
この回答へのお礼

ありがとうございます。確かに。

お礼日時:2016/04/05 22:17

>private(private)


自分自身のクラスのみアクセスを許可
>package private(※何も書かない)
自分と同じパッケージに属するクラスのみアクセスを許可
>protected(protected)
自分と同じパッケージに属するクラスと自分を継承したサブクラスのみアクセスを許可
>public(public)
すべてのクラスにアクセスを許可

です。()内はソース内での宣言方法です。
    • good
    • 0
この回答へのお礼

ありがとうございます。パッケージ概念がよくわかりました。

お礼日時:2016/04/05 22:15

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