2012-02-07 11 views
3

私はJavaでプログラムを作成しており、演算子のオーバーロードが何であるかを正確に理解しようとしています。私はまだ少し困惑しています。オペレータのオーバーロードとは何ですか?多態性とは異なりますか?

オペレータは、使用するクラスによって異なる意味を持ちますか?私はそれが "名前多態性"であると読んだ。

Javaは明らかにそれをサポートしておらず、この周りには多くの論争があるようです。私はこれについて心配すべきですか?

最後の質問として、教師は代入が演算子のオーバーロードを使用すると述べていますが、彼は主にC++プログラマですが、Javaで割り当てを書くことは許可されています。 Javaはオーバーロードをサポートしていないので、私は慎重にすべきことがありますか?

+0

演算子のオーバーロードはJavaでは実行できません。これはC++で行われます(他の言語も同様です)。基本的には、独自の演算子を作成し、必要に応じてそれらを実行させます。あなたは再定義することができます - 2つの数値を減算するのではなく、2つの数値を加算すること。たとえば、複素数に対して+を定義することができます。 – Adrian

答えて

9

オペレータのオーバーロードは基本的に、異なるデータ型に対して同じ演算子を使用することを意味します。そして、これとは違っていますが、同様の動作をします。

Javaは実際にはこれをサポートしていませんが、このようなものが役に立つ場合は、Javaで簡単に回避できます。

Javaのオーバーロードされた演算子は、演算子+のみです。数字(intlongdoubleなど)と一緒に使用すると、期待通りに追加されます。 Stringオブジェクトとともに使用すると、オブジェクトが連結されます。たとえば、

String a = "This is "; 
String b = " a String"; 
String c = a + b; 
System.out.print (c); 

This is a Stringと表示されます。

これは、オペレータのオーバーロードについて話すことができるJavaの唯一の状況です。

割り当てについて:オペレータのオーバーロードが必要な場合は、Javaでは実行できません。この特定の課題にどの言語を使用することができるかを先生に教えてください。あなたはおそらくC++でそれを行う必要があります。

PS:Integer、、Doubleなどのオブジェクトの場合は、アンボックスのためにも機能します。

3
より演算子のオーバーロードの限定セットを持っています

Javaでは演算子のオーバーロードが許可されていません。 +は、コンテキストに応じて加算または連結を行うため、非常に限定された種類の演算子オーバーロードを使用します。

演算子のオーバーロードによって何かを実装するように指示されている場合は、Javaでは実行できません。たぶんあなたは教師になぜそのような割り当てのためにJavaを許可するのかを尋ねるべきです。

割り当てがオーバーロードされた演算子を使用するように要求された場合、連結と加算にプログラムで+を使用すると、請求書に適合します。しかし、私は先生に尋ねるでしょう、なぜなら私はそれが彼が期待しているものだと疑うからです。

+0

申し訳ありませんが、私は先生に再度確認します。ありがとう – Snorkelfarsan

1

Javaは明らかにこれをサポートしておらず、この周りには 論議がたくさんあるようです。

は、についてこれに関する論争があります。一部の人々はこの決定に同意しないかもしれないが、James Goslingと他の人はクラス開発者から演算子のオーバーロードを残すことに決めた。それは変わる可能性は低いです。

ここで他の人に指摘されているように、JVMが限定的にオペレータを過負荷にする権利が予約されていました。要は、独自のクラスを開発しているときにはできないということです。

能力の悪用C++開発者の例(例えば、ドット演算子をオーバーロードする。)

が、私はこのことを心配すべきがあったので、彼らはそれをやりましたか?

いいえ、Javaは爆発しません。あなたはクラスのためにそれをすることができません。あなたが必要と思っているのであれば、C++やその他の言語を書かなければなりません。

0

演算子のオーバーロードと多型の違いについてのクエリについては、多態性は、基本的なOOPの概念であり、クラスのインスタンスは、基礎となる型に応じて異なる特性を示す場合があります。たとえば、C++の場合:

class Shape { 
... 
virtual void draw()=0; 
} 

class Circle :public Shape { 
virtual void draw() {...draw a circle...} 
} 

class Square:public Shape { 
virtual void draw() {...draw a square...} 
} 

.. 

Shape *s = new Circle(); 
s->draw(); // calls Circle::draw(); 
s=new Square(); // calls Square::draw(); 

したがって、sは多型を示しています。

これは演算子のオーバーロードとは異なりますが、これは他の回答の内容を既に説明しています。

+0

演算子のオーバーロードが多形の単純な形式であると言うのは正しいでしょうか? – Snorkelfarsan

+0

多形としてのIMHOは、多くの形を示すことを意味します。関数のオーバーロードは多分私が推測する多型に近い。 – Sid

関連する問題