No.6ベストアンサー
- 回答日時:
……できれば、質問し直す時は分けて下さいね。
いつまでたっても収束しませんから。質問1への回答
この場合、Mainと親クラスの関係だけが問題となります。
親クラスのメソッドfunc()を、別パッケージのMainがアクセスできるのは、前の私の回答を順に当てはめればpublicしか無い事に気づくはずです。
子クラスのオーバーライドの有無は関係ありません。Mainはインスタンスが親であれ子であれ、親クラスのクラス定義に従ってfunc()を読んでいるだけです。
質問2への回答
それが多態性というものです。Oya.foo()はあくまでOya.func()を読んでいるに過ぎません。それがabstractで、実は実態がないものだとか、そういうのは関係ありません。なぜなら、実際にfoo()がfunc()を呼び出している時点で、なんらかのインスタンスが生成されている筈で、そのインスタンス生成の条件はクラスやメソッドがabstractでない事だからです。
そうやって、「実態がある」と保証されたインスタンスのfunc()を呼んだ際には、オーバーライドによって実際のインスタンスを定義する子クラスkoのfunc()が呼び出されます。
No.5
- 回答日時:
指定無し : 同一パッケージからのみ参照出来る。
制限付きのpublicみたいなモノprivate : そのクラスでしか参照出来ない、もっとも範囲が狭い
protected : privateに加えて、継承した子クラスからも参照出来る
public : どのクラスからも参照出来る、公開された情報
通常、同一パッケージで継承したならprivate以外のどんな宣言でも見えます。
takeshix100の場合、それに「パッケージが違う」という条件が加わったので、protected, publicの2つに絞られた訳です。
オーバーライドするときも、単にメソッドを呼ぶ時も、「参照出来るか否か」という判断はこの4種類に絞られます。
#inner class等が絡むとまた混乱しますが、パッケージの指定と基本は同じですので。
この回答への補足
dekopa-様へ
ご回答ありがとうございました。私の本当に知りたいこと
が質問内容にうまく反映されていませんでしたので、改め
て質問をさせていただきます。質問が2つございます。
質問1 メソッドのオーバーライドについてのことなので
すが、親クラスと子クラスはともに異なるパッケ
ージの中にあるとき、パッケージの外にある
Mainクラス(mainメソッドのあるクラス)で、子ク
ラスをnewした値を親クラスの参照変数に代入し
て、その参照変数で子クラスでオーバーライドし
ているメソッドを呼出したとき、親クラスのオー
バーライドされたメソッドは、Mainクラスから見 えるようにpublicにしなければならないのはなぜ なのか。
質問2 以下のコードで、Oyaクラスのfooメソッド内で
funcメソッドを呼び出すとき、OyaクラスからKoク
ラスのprotectedなメソッドをなぜ呼び出すことが
できるのか。
//////////////////////////////////////////////////
package ko;
import oya.Oya;
public final class Ko extends Oya
{
protected void func()
{
System.out.println("func");
}
}
//////////////////////////////////////////////////
package oya;
public abstract class Oya
{
protected abstract void func();
public final void foo()
{
this.func();
}
}
//////////////////////////////////////////////////
import oya.Oya;
import ko.Ko;
final class Main
{
public static void main(String[] args)
{
Oya oya = new Ko();
oya.foo();
}
}
//////////////////////////////////////////////////
以上です。どうかご教授のほどよろしくお願いします。
No.4
- 回答日時:
しばらくJAVAから離れてるのであまり自信はないですが。
質問者様がどれくらいJAVAを理解しているのかにもよるのですが、今回のプログラムに限っての話しとしては。
abstractクラスを継承する場合には継承した方のクラスはabstractクラスに宣言されているメソッドをオーバーライドするか継承した方のクラスもabstract宣言をしなければエラーになります。
>オーバーライドされる親クラスのメソッド
は、子クラスからアクセス可能なアクセス修飾子を
修飾しなければいけないということなのでしょうか?
の質問ですが。
#2の時も書いたのでもう一度読んでみてください。
結論としてはだいたいその考えでokだと思います。
今回の話では違うパッケージでやっているわけですから違うパッケージからでもokなアクセス修飾子をつけなくてはいけないです。
アクセス修飾子というのはどこからアクセスできるか。
というのを設定しています。
もう一度書いてみます。
private・・・同じクラス内でのみ使用できる
default・・・同じパッケージ内のすべてのアクセスok
protected・・・同じパッケージ内、違うパッケージ内
そのサブクラスからアクセスok
public・・・どこからでもok
違うパッケージ内の場合はdefaultとpraivateは違うパッケージでは呼び出せませんよね?
試しに同じパッケージにしてdefaultとprivateを試してみてください。
となると自然と答えが見えてくると思います。
#2とあわせてもう一度読んでみてください。
No.3
- 回答日時:
#1の方の言ってるのは嘘です。
逆だと思います。
実際にやってみれば歴然です。
で、質問の回答ですが。
Oyaクラスのfuncメソッドの修飾子はデフォルトなので、他のパッケージからは見えません。
なので、別パッケージであるkoクラスはfuncメソッドが見えません。
しかし、Oyaクラスのfuncメソッドを実装しないとならないのでエラーとなります。
この回答への補足
DQ9様へ
ご回答ありがとうございます。D9様へ質問がございま
す。Oyaクラスのメソッドが別パッケージのKoクラスで
オーバーライドされるためには、Oyaクラスのメソッドが
Koクラスから見えるようにアクセス修飾子を修飾しなけれ
ばいけないということでよろしいのでしょうか?
No.2
- 回答日時:
えっとそれはアクセス修飾子の話しですが。
private>default>protected>public
でprivateのほうが強くなります。
No.1の方も書いてありますが、オーバーライドするときは親クラスのメソッドより子クラスのメソッドのアクセス修飾子を弱くするか同じにしなければいけません。
しかし、今回の問題はパッケージが違うということで
privateは同じクラス内
defaultは同じパッケージ内
protectedは違うパッケージでもok
publicはなんでもok
と言う様に子クラスからアクセスできる範囲が決まっていますので、今回は違うパッケージなのでprotected以下の弱いアクセス修飾子を親クラスのメソッドに定義していなければ違うパッケージで子クラスのメソッドをオーバーライドすることはできまん。
多分こんな感じだと思います。
この回答への補足
改めて質問をさせていただきます。
「子クラスからアクセスできる・・・・」
ということは、オーバーライドされる親クラスのメソッド
は、子クラスからアクセス可能なアクセス修飾子を
修飾しなければいけないということなのでしょうか?
どうかご教授のほどよろしくお願いします。
No.1
- 回答日時:
メソッドをオーバーライドするときは、そのスコープが広い方向へアクセス修飾子を付け直すことはできません。
例えば、親クラスのメソッドがprotectedだった場合、子クラスでオーバーライドする際にprotectedやprivateにはできますがpublicにはできません。
スコープの範囲は、
public > protected > default(修飾子なし) > private
です。
子クラスのアクセス修飾子を確認してみてください。
この回答への補足
私の質問の仕方が本来の質問のしたかったこととは異なっ
ていたようですので、改めて質問をさせていただきます。
例えば、以下のサンプルで、
//////////////////////////////////////////////////
package oya;
public abstract class Oya
{
abstract void func();
}
//////////////////////////////////////////////////
package ko;
import oya.Oya;
public final class Ko extends Oya
{
public void func()
{
System.out.println("func");
}
}
//////////////////////////////////////////////////
import ko.Ko;
final class Main
{
public static void main(String[] args)
{
Ko obj = new Ko();
obj.func();
}
}
//////////////////////////////////////////////////
Oyaクラスの抽象メソッドのアクセス修飾子がデフォルト
であった場合にたとえKoクラスのオーバーライドしたメソ
ッドがpublicであったとしても、コンパイル時に
「オーバーライドできません。」と警告されます。それは
どうしてなのでしょうか改めてご教授のほどよろしく
お願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 15:14
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- C言語・C++・C# C# 継承の問題で programに示された拡張をすべて含んだ上で,クラス Mammal に,そのオ 1 2022/07/22 09:48
- Visual Basic(VBA) エクセルVBAで以下のようなコードを書いたらエラーになりました。何処が間違っているの教えて? 1 2023/02/10 18:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Javaのインスタンス化の構文の...
-
委譲って何ですか?
-
「継承されたメソッドの可視性...
-
なぜForm型にキャストするので...
-
サーバー上のフォルダ情報の取得
-
C# 「データが失なわれる可能性...
-
(vba)他のアプリケーションの右...
-
「IOException は対応する try ...
-
JAVAの初歩でとても悩んでます・・
-
親クラスのメソッドを別のパッ...
-
interface,extend,implementの...
-
ASP.NETでの共通コードの書き方...
-
VBAでの[]
-
「タイプ初期化子が例外をスロ...
-
変数名の付け方
-
エクセルVBAで、条件に一致する...
-
private static という変数の修飾
-
Java初級 引数に適用できません
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
interface,extend,implementの...
-
C# 「データが失なわれる可能性...
-
「ラッパークラス」の存在意義...
-
c++でのヘッダーファイルの循環...
-
(vba)他のアプリケーションの右...
-
「継承されたメソッドの可視性...
-
「IOException は対応する try ...
-
ゲッターを使わないで変数にア...
-
JavaでのAPIの覚え方ってみさな...
-
VB DLLプロジェクトについて
-
Javaで下線
-
【C#】クラスのコンストラクタ...
-
Javaのインスタンス化の構文の...
-
委譲って何ですか?
-
ASP.NETでの共通コードの書き方...
-
オーバーライドとラッパーの違い
-
抽象クラスをJUNITでテストする...
-
JTextFieldの入力制限
-
Commons-Discovery.jarとは?
-
setTextについて
おすすめ情報