映画のエンドロール観る派?観ない派?

JAVAについての質問です。
Java versionは1.6.0_43で、
BlueJ versionは3.0.8です。

これはDriveです↓
Temperature t1 = new Temperature ();
Temperature t2 = new Temperature ('F');
t2.setTempObj(32.0);
System.out.println ("Does 0C equal 32F: " + t1.equals(t2));

そしてこれがクラス↓
public boolean equals(Temperature testObj)
{
return //ここにいれるものがなにかわからない。
}

アウトプットはtrueです。
booleanのところがdoubleとかなら入れものがわかるのですが、
trueかfalseの場合分けみたいなときはなにを入れたらいいのでしょうか?
if文をいれようとも考えましたが結局意味がわからず終いでした。
必要な情報があったら言ってください。
乱文ですが、よろしくおねがいします。

A 回答 (7件)

例えば


public int foo(int a) {
// aが5より大きかったらa-5、そうでないなら-1を返すメソッド
}
とあったら、どんな書き方しますか?

public int foo(int a) {
if( a>5 ) {
return a-5; // a-5はint
} else {
return -1; // -1はint
}
}
こんな風に書きませんか?
intがbooleanに変わったって、同じことです。メソッドの仕様に合わせてtrueかfalse(か、計算結果がbooleanになる式)をreturnするだけです。


> 一応TemperatureDrive と Temperatureというクラスに分けて書いているので、クラスって書きました。

この場合なら「Temperatureクラスのequalsメソッド」と書くべきです。
「クラス」とだけ書いてあっても、どのクラスのかわかりません。
そもそも、クラスではありません。


if (t1==t2)
{
true
}
else
{
false
}

trueとfalseがreturn true; とreturn false;として。
// return if (t1==t2){true}else{false}と書こうとした、ってことは無いですよね?


if (t1==t2)
に2つ問題があります。

一つ目。
ta.equals(tb)
のように使おうとしています。taのequalsメソッドで引数がtbということです。
このとき、メソッドの定義で、自分自身であるtaはどんな方法で表されるのか、引数であるtbはどんな方法で表されるのか、わかりますよね?

二つ目。
オブジェクト同士の==の意味、わかってますよね?
自分と、引数で指定したものとの、「何が等しい」ければ、equalsであるといえるでしょうか?

この回答への補足

public boolean equals(Temperature testObj)
{
return //ここにいれるものがなにかわからない。
}

この間にta.equals(tb)こういうのを入れるってことですか?
でも、この間に入れると重複してるような感じになってしまうので違和感なのですが、
どうでしょう?

僕の質問が下手で理解しづらいと思いますがよろしくお願いします。

補足日時:2013/04/14 08:06
    • good
    • 0
この回答へのお礼

お礼が遅れてすみません。
いろいろな知識が知れてよかったです。
ありがとうございました!!

お礼日時:2013/04/29 07:30

> public boolean equals(Temperature testObj)



やろうとしているのが、Object.equals(Object) のオーバライドだと思いますので、
public boolean equals(Object testObj)
の誤りだと仮定して書きます。


端的に言うと、既に皆さんが指摘されている通り、equals では引数とそのオブジェクト自身が「等価」か否かを返すコードを書きます。何を持って「等価」とするかは、クラスの仕様の作成者、つまり質問者さんが決めれば良いです。
http://docs.oracle.com/javase/jp/6/api/java/lang …
(古いバージョンのドキュメントですがこの部分は変わっていません)


といっても、equals の位置づけが分かっていないので、意図が伝わらず、話が噛み合わないのだと思います。

文字列を例にとって考えてみましょう。

String str1 = "aaa";
String str2 = "bbb";

if (str1.equals(str2)) {
 System.out.println("等しい");
} else {
 System.out.println("違う");
}

このようなロジックが有ったとすると、「違う」が表示される事は分かりますよね?
st1, str2 共に "aaa" にして実行すると、どうなるでしょう。
「等しい」が表示されますよね?

これは String.equals(Object) メソッドにその様なコードが書かれているからです。

つまり、そのクラスのオブジェクトを使っているコードで、2つのオブジェクトが等しいかどうかを調べたい時に使えるようなロジックを、 equals に書くのです。

↓今は改装中みたいですが、復活したら下記のページも参考になると思います。
http://www.ibm.com/developerworks/jp/java/librar …



蛇足ですが、文字列の例では"aaa"を設定したものは本当は同一のオブジェクトになっているのですが、簡単にする為にその点には触れませんでした。興味が有ったら、「Java 文字列 リテラル 同一」辺りで検索して下さい。
    • good
    • 0
この回答へのお礼

お礼が遅れてすみません。
リンクも貼っていただきありがとうございます。
参考にさせていただきます。
ありがとうございました!!

お礼日時:2013/04/29 07:32

>すみません、一応TemperatureDrive と Temperatureというクラスに分けて書いているので、クラスって書きました。



勝手にクラスやメソッドの意味を変えられても他の人には何の事かわかりません。

>僕のイメージだと
>if (t1==t2)
>{
>true
>}
>else
>{
>false
>}
>ってイメージなんですけどずれてますか?

あなたがTemperature#equalsをどうしたいか(どのようなときにtrueを返したいのか、どのようなときにfalseを返したいのか)書かれていませんので回答できません。
    • good
    • 0
この回答へのお礼

お礼が遅れてすみません。
これからの質問の際に参考になるような回答ありがとうございます。
次からは書くようにします!
ありがとうございました!!

お礼日時:2013/04/29 07:34

#2に書いたfooメソッドの動きは理解できてますか?



> public boolean equals(Temperature testObj)
> {
> return //ここにいれるものがなにかわからない。
> }

別に1行のreturn文で全部に対応させる必要はありません。
intやdoubleと同様に、「trueという値」か「falseという値」を返せばいいのです。条件で違うならifをつかえばいいだけです。

if(条件式) {return true;}else{return false ;}

// 条件式は、条件が成立すればtrue、不成立ならfalseという値になります。
// そのことを使って、上記は return 条件式; とも書けます。
// でも、まずは基本を習得するのが先です。


> ta.equals(tb)

これは、t1,t2をequalsメソッドで使おうとしているのを見て、このメソッドで扱うのはt1,t2だけではない、という意味で書きました。

他のメソッドで
Temperature ta,tb,tc,td ;
(略)
if( ta.equals(tc) ) { ...
if( tb.equals(td) ) { ...
if( tc.equals(td) ) { ...
などと使うものです。そう考えれば、t1,t2を直接比較しようとすること自体が間違いだとわかるはずです。
で、equalsメソッドの定義の中で
t1.equals(t2)としたときに、t1にあたるのは何か、t2にあたるのは何か?
ta.equals(tb)としたときに、taにあたるのは何か、tbにあたるのは何か?
それが理解できていれば、少なくともt1==t2とはならないはずです。
    • good
    • 0
この回答へのお礼

お礼が遅れてすみません。
いろいろな知識が知れてよかったです。
ありがとうございました!!

お礼日時:2013/04/29 07:34

既に回答にある通りequalsはクラスではなく、メソッドですが、それが等価の場合はtrueを返し、そうでないときにfalseを返すようプログラムを書くだけかと。

そして、何が等しくて、何が等しくないと思うかはあなた (あるいは、プログラムの設計) が決めます。

質問の設定だけ見るとPolymorphismの説明に使われる典型的なプログラムの一つのような気がしますが、こういうことをしたかったのでしょうか?

interface Temperature {
public double getCelsius();
public double getFahrenheit();
}

class CelsiusTemperature implements Temperature {
private double temperature;

public void setTemperature(double temp) {
temperature = temp;
}
public double getCelsius() {
return temperature;
}
public double getFahrenheit() {
return temperature * 1.8 + 32;
}
public boolean equals(Temperature t) {
return temperature == t.getCelsius();
}
}

class FahrenheitTemperature implements Temperature {
private double temperature;

public void setTemperature(double temp) {
temperature = temp;
}
public double getCelsius() {
return (temperature - 32) / 1.8;
}
public double getFahrenheit() {
return temperature;
}
public boolean equals(Temperature t) {
return temperature == t.getFahrenheit();
}
}

public class TemperatureDriver {
public static void main(String[] string) {
CelsiusTemperature t1 = new CelsiusTemperature ();
FahrenheitTemperature t2 = new FahrenheitTemperature();
t2.setTemperature(32.0);
System.out.println ("Does 0C equal 32F: " + t1.equals(t2));
}
}

equalsメソッドは2つのオブジェクトが等しい (等価) ときにはtrue、等しくないときにはfalseを返します。
http://docs.oracle.com/javase/7/docs/api/java/la …
何を等しいと考えるかはクラスの設計によるのでJavaが言語として与えてくれることはありません。Javaではそれをプログラムを書く人が自由に変更できるようequalsを各クラスで定義することを許しています。


なお、自分が上記で書いたプログラムでは、摂氏あるいは華氏同士の温度で比較して温度が一致した場合は等価としています。


あるいは、例えば摂氏で比較して一致した場合は一致したと考えるというやり方もあったかもしれません。
abstract class Temperature {
abstract public double getCelsius();
abstract public double getFahrenheit();
public boolean equals(Temperature t) {
return this.getCelsius() == t.getCelsius();
}
}

class CelsiusTemperature extends Temperature {
private double temperature;

public void setTemperature(double temp) {
temperature = temp;
}
public double getCelsius() {
return temperature;
}
public double getFahrenheit() {
return temperature * 1.8 + 32;
}
}

class FahrenheitTemperature extends Temperature {
private double temperature;

public void setTemperature(double temp) {
temperature = temp;
}
public double getCelsius() {
return (temperature - 32) / 1.8;
}
public double getFahrenheit() {
return temperature;
}
}

> if (t1==t2)
> {
> true
> }
> else
> {
> false
> }
> ってイメージなんですけどずれてますか?

全然違いますね。これだったらわざわざequalsを使う必要ありません。
t1.equals(t2)の代わりにt1 == t2と書けばできますが、常にfalseを返すでしょう。
t1 == t2では等値であることを調べていますが、t1とt2の指す参照が違うのでfalseになります。
t1.equals(t2)ではt1のequalsメソッドにて単位を変換して同じ温度だった場合にtrueを返すと作ってあれば、同じ温度ならtrueを返すようになるでしょう。

その作りこみはプログラムを書いた人がequalsメソッドを書くことでします。

> この間にta.equals(tb)こういうのを入れるってことですか?

ちがいます。
質問者が等価とする場合にtrueを返すような式を入れてください。

なお、上記の自分の例では最初の例だと自分と同じ単位に変換して比較をして、あとの例だと摂氏にで比較して、値が一致したらtrueを返すようにしています。
    • good
    • 0
この回答へのお礼

お礼が遅れてすみません。
深い知識が知れてよかったです。
ありがとうございました!!

お礼日時:2013/04/29 07:34

> 僕のイメージだと


> if (t1==t2)
> {
> true
> }
> else
> {
> false
> }
> ってイメージなんですけどずれてますか?

if (t1==t2)
{
 return true;
}
else
{
 return false;
}

と書くのは

 return t1 == t2;

と書く場合と同じ結果になりますよ。
比較演算の結果はブーリアン値なので。
    • good
    • 0
この回答へのお礼

お礼が遅れてすみません。
なんとなくきっかけがつかめました!
ありがとうございました!!

お礼日時:2013/04/29 07:35

equalsメソッドの意味から考えてください。



>そしてこれがクラス↓

それはクラスではなくメソッドです。

この回答への補足

すみません、一応TemperatureDrive と Temperatureというクラスに分けて書いているので、クラスって書きました。
僕のイメージだと
if (t1==t2)
{
true
}
else
{
false
}
ってイメージなんですけどずれてますか?
ちなみにdrive側は固定です。

補足日時:2013/04/14 03:06
    • good
    • 0
この回答へのお礼

お礼が遅れてすみません。
ありがとうございました!!

お礼日時:2013/04/29 07:36

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