プロが教えるわが家の防犯対策術!

オブジェクト指向と言われているオーバーロード、オーバーライドの違いを詳しく教えてください。また、コンストラクタがオーバーライドするってことはあるのでしょうか??
一応、スーパークラス・サブクラスという言葉は知っています。

A 回答 (4件)

オーバーロードについては他の方の説明で十分だと思います。



例えばこんな感じですね:
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には関数と呼ばれるものは存在しません。おそらく、メソッドのことを誤って関数と呼んでいるのでしょう。言語によって用語の意味が異なるというのはこういうことです)

この回答への補足

回答ありがとうございます。コンストラクタのオーバーロードについて、どんな例があるのかあげてほしいです。

補足日時:2004/07/19 07:07
    • good
    • 0

コンストラクタのオーバーロードは、メソッドのオーバーロードとほとんど同じですよ。



例えばこんな感じです。

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

補足日時:2004/07/22 01:52
    • good
    • 0

僕も昔、この2つの用語をよく間違って使っていたので


こうやって覚えています。

● オーバーロード
ロードとは Load ということで、「積む」という意味があります。
トラックに荷物をどんどん「積む」様子をイメージしてください。
つまり、あるクラスに(同じ名前の)関数をどんどん「積む」感じです。
荷物に上下関係はなく、平等でどれも有効な関数です。

クラスというトラックに関数を積む
■■■... という感じ

● オーバライド
ライド とは Ride ということで(ホント?)、「乗る」という意味があります。

上から乗るということで、「上乗り・くつがえす」という
様子をイメージしてください。
つまり、スーパークラスのある関数を(同名の)関数で
「くつがえす」感じです。

スーパークラスの関数の上に乗るっていうのは


■という感じ

> コンストラクタがオーバーライドするってことはあるのでしょうか??

引数があるコンストラクタの場合、サブクラスで
同じ引数をとるコンストラクタを宣言した時、
スーパークラスのコンストラクタは明示的に
super を使わないと呼び出されません。

そういう意味で、「引数ありコンストラクタが
オーバーライドされた」という風に表現できる
のかもしれません。

同名の関数で上書きすることをオーバーライドという
のであれば、コンストラクタはクラス名を使うので
異なる名前になり、「オーバーライド」という用語が
適用されるのかどうかは、よく分からないです。

「コンストラクタ」という(機能を表す)名前の関数において
「オーバーライド」と同じ現象が起こっている。とでも
いうのでしょうかね?

この回答への補足

回答ありがとうございます。オーバーロード、オーバーライドについての例えが分かりやすかったです^^。

補足日時:2004/07/19 07:16
    • good
    • 0

オーバーロードはメソッド名は一緒ですが、シグネチャーが異なります。


もっと簡単言うと、同一クラス内に同一名のメソッドがあっても、同じなのは名前だけでパラメータが違えば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)し、メソッドをオーバーライドしてやらないといけなくなっているということもいえるでしょう。

この回答への補足

回答ありがとうございます。

補足日時:2004/07/19 07:17
    • good
    • 0

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