No.3ベストアンサー
- 回答日時:
オーバーロードについては他の方の説明で十分だと思います。
例えばこんな感じですね:
class A {
public void method() {}
public void method(int x) {}
public void method(double x) {}
public void method(Object x) {}
}
オーバーライドについてですが、これは分かりやすく言うとスーパークラスやスーパーインタフェースのメソッドを継承する代わりに上書きすることです。
(継承についてはお分かりですよね?)
例:
class P {
public void method() {
// ここで何かをする
}
}
class Q extends P {
public void method() {
// ここで別な何かをする
}
}
class R extends P {
}
PのサブクラスであるQでは、methodというメソッドを上書きしているわけです。これが「オーバーライド」です。
RもPのサブクラスですが、methodというメソッドは上書きしていません。この場合、methodというメソッドはPからRに「継承」されるのです。
なお、上書きされるメソッドが抽象(abstract)メソッドの場合、「オーバーライド」とは言わずに「実装」といいます。したがって、King-of-Walkingさんの回答に出てきたHttpServletの例は厳密には正しくありません。(もっとも、これはJavaにおける単純な言葉の使い分けの問題ですが)
なお、Javaではコンストラクタがオーバーライドされることはありえません。(オーバーロードは可能です)
コンストラクタはクラスのメンバーではないので、継承されることはありません。したがって、上書きすることもできないのです。(コンストラクタはクラスごとに独立しているということです)
ただし、Java以外のオブジェクト指向言語ではオーバーライドや継承などといった用語の意味が多少異なることがあるので注意してください。
上に書いた説明も、Java以外の言語では正しくない可能性があります。
(toginoさんが関数という言葉を用いていますが、Javaには関数と呼ばれるものは存在しません。おそらく、メソッドのことを誤って関数と呼んでいるのでしょう。言語によって用語の意味が異なるというのはこういうことです)
No.4
- 回答日時:
コンストラクタのオーバーロードは、メソッドのオーバーロードとほとんど同じですよ。
例えばこんな感じです。
class SampleClass {
SampleClass() {}
SampleClass(int x) {}
SampleClass(double x) {}
SampleClass(String x) {}
}
この回答への補足
ありがとうございます!すいませんが、まだ質問してよろしいですか?このプログラム(以下に示します)はなぜこう出力されるのか教えてください。お願いします。メソッドvoid action1()以下からどういう処理がされているか分かりません(*_*)。
class AA{
int fa,fb;
AA(int a,int b){
fa=a; fb=b;
}
void action1(){
fa++;
int fb=fa;
}
void action2(int fa){
fa=fa*100;
}
}
class workg2{
public static void main(String[] args){
AA a1=new AA(10,200);
System.out.println(a1.fa+","+a1.fb);
a1.action1();
System.out.println(a1.fa+","+a1.fb);
a1.action2(a1.fb);
System.out.println(a1.fa+","+a1.fb);
}
}
出力結果:
10,200
11,200
11,200
No.2
- 回答日時:
僕も昔、この2つの用語をよく間違って使っていたので
こうやって覚えています。
● オーバーロード
ロードとは Load ということで、「積む」という意味があります。
トラックに荷物をどんどん「積む」様子をイメージしてください。
つまり、あるクラスに(同じ名前の)関数をどんどん「積む」感じです。
荷物に上下関係はなく、平等でどれも有効な関数です。
クラスというトラックに関数を積む
■■■... という感じ
● オーバライド
ライド とは Ride ということで(ホント?)、「乗る」という意味があります。
上から乗るということで、「上乗り・くつがえす」という
様子をイメージしてください。
つまり、スーパークラスのある関数を(同名の)関数で
「くつがえす」感じです。
スーパークラスの関数の上に乗るっていうのは
■
■
■という感じ
> コンストラクタがオーバーライドするってことはあるのでしょうか??
引数があるコンストラクタの場合、サブクラスで
同じ引数をとるコンストラクタを宣言した時、
スーパークラスのコンストラクタは明示的に
super を使わないと呼び出されません。
そういう意味で、「引数ありコンストラクタが
オーバーライドされた」という風に表現できる
のかもしれません。
同名の関数で上書きすることをオーバーライドという
のであれば、コンストラクタはクラス名を使うので
異なる名前になり、「オーバーライド」という用語が
適用されるのかどうかは、よく分からないです。
「コンストラクタ」という(機能を表す)名前の関数において
「オーバーライド」と同じ現象が起こっている。とでも
いうのでしょうかね?
No.1
- 回答日時:
オーバーロードはメソッド名は一緒ですが、シグネチャーが異なります。
もっと簡単言うと、同一クラス内に同一名のメソッドがあっても、同じなのは名前だけでパラメータが違えばOKなんです。オーバーロードはぶっちゃけこれだけです。
だから、メソッドの呼び出し先などを探すときに、パラメータが違うだけですから探し方によっては結構戸惑いますね。普通にCtl+Fで探そうとすると、シグネチャーの違うメソッドにも飛んでいってしまいますから。eclipseなどでは簡単に探せますが。
オーバーライドは、スーパークラスなどで定義されているメソッドをサブクラスで実装しなければいけなかったりする場合使います。
たとえば、HttpServletクラスなどは抽象クラス(処理が実装されていない)しか提供してくれていないので、オーバーライドしないと何もできないということになると思います。
ですからHttpServletを拡張したクラスではこんな風に・・・
protected void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
//TODO Method stub generated by Lomboz
}
HttpServletクラスのメソッドを実装するようにeclipseによって自動生成されています。
この場合、HttpServletクラスは
public abstract class HttpServlet extends GenericServlet
と抽象クラスになっているので、サブクラスで拡張(extends)し、メソッドをオーバーライドしてやらないといけなくなっているということもいえるでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ビデオカード・サウンドカード PCで、ステレオ楽曲を聴きたい 9 2022/04/06 14:31
- Windows 10 windows11が突然起動しなくなりました 3 2022/06/30 17:49
- プリンタ・スキャナー 電化製品が一度もまともに稼働しない場合、返品・返金してもらえないものなの? 3 2023/01/19 23:37
- デスクトップパソコン NVIDIA Quadro K2000とNVIDIA Quadro K420どちらが優れていますか? 6 2023/02/28 18:16
- ブルーレイ・プレーヤー・レコーダー ブル-レイレコダーの修理 9 2023/05/29 20:59
- ノートパソコン ハードディスクが壊れたPCのオークションへの出品の仕方を教えてください 9 2022/11/16 08:13
- 掃除機・クリーナー・空気清浄機 掃除機が使用不能になり、メーカ問い合わせで修理不可と言われてしまいました。 4 2022/12/01 00:43
- Bluetooth・テザリング iPhone12mini グレーアウト 1 2023/04/09 20:10
- その他(生活家電) 修理に出す際の送料はお客様負担が普通なの? 9 2022/10/10 13:27
- CPU・メモリ・マザーボード 2009年のHPのデスクトップPCはCPU交換等して活用できますか/する価値はありますか? 9 2022/09/27 16:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
レコード件数の表示
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
StringBufferからStringへキャ...
-
abstract と static を一緒に付...
-
[クラス名].[メソッド名].[メソ...
-
public static void main (Stri...
-
コマンドライン引数のチェック
-
Google Apps Script で getRang...
-
Javaの関数名が長い?
-
なぜprotected overrideなのか
-
C# 点の描き方をおしえてくだ...
-
Javaの文法
-
Javaで色表現10進→16進のクラス...
-
javaに"search"という関数 or ...
-
C# でメソッドに送られてきたOb...
-
overrides
-
Javaの問題なんですが、練習14-...
-
別クラスのmainメソッドの実行
-
親の親のメソッドを呼ぶには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Java初級 引数に適用できません
-
public static void main (Stri...
-
レコード件数の表示
-
abstract と static を一緒に付...
-
なぜprotected overrideなのか
-
C# 点の描き方をおしえてくだ...
-
コマンドライン引数のチェック
-
String.containsの反対機能はあ...
-
Google Apps Script で getRang...
-
StringBufferからStringへキャ...
-
Java初心者です、エラーの意味...
-
javaに"search"という関数 or ...
-
C# でメソッドに送られてきたOb...
-
YYYYMMDD書式の日付に対する適...
-
メソッド宣言の戻り値の型にク...
-
return new使用時
-
readLine()ではじめから読み直...
-
シェルスクリプトからのJavaメ...
-
Fileの読み取り専用の解除
-
親の親のメソッドを呼ぶには?
おすすめ情報