ここから本文です

抽象クラスでのprotectedとpublicの違いは?

aki********さん

2013/4/200:08:10

抽象クラスでのprotectedとpublicの違いは?

他人のソースを見ていてふと思ったのですが、

public abstract class Person {

protected String name;

public Person(String name){
this.name = name;
}

・・・

}

みたいなコードがあったのですが、抽象クラスの中で宣言されているprotectedやpublicの変数やメソッドは同じアクセス制限だと思い、これは結局全部publicでも同じことなんじゃないかと思ったのですが、どうなのでしょうか?
慣例等があるのでしょうか?

閲覧数:
1,396
回答数:
5
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

kon********さん

2013/4/315:00:38

abstract finalならprotectedは無意味になりますので
全部publicで良いことになりますが、
abstract finalは許可されていないようです。

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜4件/4件中

並び替え:回答日時の
新しい順
|古い順

har********さん

2013/4/809:50:47

◇抽象クラスの中で宣言されているprotectedやpublicの変数やメソッドは同じアクセス制限だと思い
protectedの場合、他パッケージからのアクセスはこのクラスのサブクラスのみに限られます。
同一パッケージ内であればクラス間の継承関係にかかわらず、どのクラスからもアクセスが許可されます。
publicであれば、他のパッケージからでも一切アクセス制限がなくなります。

上記は抽象クラスでも具象クラスでも同じ扱いです。
抽象クラスはサブクラスを作成して利用するのが大前提ですから、akiyamaxxxさんの質問されているソースでは、それを意識してprotectedにされているのかもしれません。
ただ上記のソース部分だけでは、この指定にされている妥当性は判断できませんが。


noritoshinoritoshiさんの回答では、パッケージプライベートの考え方が抜け落ちています。
またアクセス制限の観点では、継承して利用する側より、他の(無関係な)クラスからのアクセスをどこまで制限するかを考慮する方が先です。

hideakira_2010さんの「オブジェクト指向を貫くのならば・・・」は、まったくいい加減な回答で呆れます。
せめて「変数は全てprivateにしなさい」ならわかりますが。

MathクラスのPIがprivateだったら、なんの意味があるでしょう。
publicなメソッドなしで、オブジェクト指向プログラミングが可能でしょうか。
技術者ならもう少し正確で意味のある回答をすべきだと思いませんか?

まあ他の回答を見せて頂きましたが、少なくてもプログラミング技術に関する知識はお持ちでは無いようですけど(だったらなぜ、わざわざ意味のない回答をされるのかが分かりませんが)。


kondowahさん、「abstract finalは許可されていないようです」って当たり前でしょう。
両方指定したら、サブクラスの作成不可な抽象クラスになってしまいますよね。
意味分かりますか?
分からないなら基礎から勉強しなおした方が良いです。


ii3pvy63さんの「最初から「とりあえず全部public」というのはありえません」って云うのは、その通りですが、この質問では誰もそんなことは云ってないようです。
だれか変な回答をしていたのでしょうか?

あと、「クラス・メソッド・メンバなどのアクセス制限は、設計段階で決めます」というのも変な日本語ですね。
Javaの場合、クラスやインターフェイスがトップレベルに有り(パッケージなどは置いといて)、そのメンバにフィールド、メソッド、(メンバ)クラス、(メンバ)インターフェイスという再帰的構造になります(例外的な組み合わせは置いておくとして)。
併記している要素のレベルがバラバラですし、使用できるアクセス修飾子もトップレベル要素とそれ以外では違いがありますが、理解されていますか?
最初はすべてprivateにしたくても、トップレベルのクラスやインターフェイス(やインターフェイスのメンバ)はprivateにできません。

nor********さん

2013/4/506:38:05

public………別のソースファイルにおいて、アクセスできる
protected …別のソースファイルにおいて、サブクラス以外はアクセスできない

抽象クラスを呼び出す場合を想像して下さい。
抽象クラスも具象クラスのように呼びだせます。
別のソースファイルでは、Person.nameは(サブクラス以外は)見えません。

しかし、継承する側にたってみれば、おっしゃるとおり同じアクセス制限です。

プロフィール画像

カテゴリマスター

hid********さん

2013/4/418:07:52

オブジェクト指向を貫くのならば、
基本的に、public は、無しです。

ii3********さん

2013/4/209:42:00

アクセス修飾子なので、外部のクラスからのアクセスを制限します。

publicメソッドは、どのクラスからでもアクセスできる(利用できる)メソッドです。
protectedメソッドは、
・自分自身のクラス(Personクラス自身)
・サブクラス(Personクラスを継承したクラス)
・同一パッケージ内のクラス(Personクラスと同じパッケージにあるクラス)
からアクセスできるメソッドです。
別のパッケージにあって、Personクラスを継承していなクラスからは、アクセスできません。

細かいことは以下のサイトにのってます。
http://www.javaroad.jp/java_class7.htm


クラス・メソッド・メンバなどのアクセス制限は、設計段階で決めます。
プログラムをする上で、各クラスの関係はできるだけ"疎の状態"になるのが望ましいです。
そのため、最初は全てprivateにして、必要に応じてアクセス制限を緩めていくのが定石です。
最初から「とりあえず全部public」というのはありえません。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる