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文をいれようとも考えましたが結局意味がわからず終いでした。
必要な情報があったら言ってください。
乱文ですが、よろしくおねがいします。
No.2ベストアンサー
- 回答日時:
例えば
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)こういうのを入れるってことですか?
でも、この間に入れると重複してるような感じになってしまうので違和感なのですが、
どうでしょう?
僕の質問が下手で理解しづらいと思いますがよろしくお願いします。
No.7
- 回答日時:
> 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 文字列 リテラル 同一」辺りで検索して下さい。
No.6
- 回答日時:
>すみません、一応TemperatureDrive と Temperatureというクラスに分けて書いているので、クラスって書きました。
勝手にクラスやメソッドの意味を変えられても他の人には何の事かわかりません。
>僕のイメージだと
>if (t1==t2)
>{
>true
>}
>else
>{
>false
>}
>ってイメージなんですけどずれてますか?
あなたがTemperature#equalsをどうしたいか(どのようなときにtrueを返したいのか、どのようなときにfalseを返したいのか)書かれていませんので回答できません。
お礼が遅れてすみません。
これからの質問の際に参考になるような回答ありがとうございます。
次からは書くようにします!
ありがとうございました!!
No.5
- 回答日時:
#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とはならないはずです。
No.4
- 回答日時:
既に回答にある通り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を返すようにしています。
No.1
- 回答日時:
equalsメソッドの意味から考えてください。
>そしてこれがクラス↓
それはクラスではなくメソッドです。
この回答への補足
すみません、一応TemperatureDrive と Temperatureというクラスに分けて書いているので、クラスって書きました。
僕のイメージだと
if (t1==t2)
{
true
}
else
{
false
}
ってイメージなんですけどずれてますか?
ちなみにdrive側は固定です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java初級 引数に適用できません
-
レコード件数の表示
-
CSVから読み込んだデータの保持...
-
Strutsでチェックボックスの値...
-
readLine()ではじめから読み直...
-
Google Apps Script で getRang...
-
java のメソッドの使い方について
-
String.containsの反対機能はあ...
-
クラスを作るとメソッドの数が...
-
public static void main (Stri...
-
StringBufferからStringへキャ...
-
なぜprotected overrideなのか
-
C# でメソッドに送られてきたOb...
-
androidのインターフェースにつ...
-
djUnit コンストラクタがpriva...
-
非静的 public final フィール...
-
voidとかstaticとか
-
メソッドのオーバーライド(java)
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
レコード件数の表示
-
StringBufferからStringへキャ...
-
C# 点の描き方をおしえてくだ...
-
Google Apps Script で getRang...
-
YYYYMMDD書式の日付に対する適...
-
C# でメソッドに送られてきたOb...
-
なぜprotected overrideなのか
-
Java初心者です、エラーの意味...
-
Strutsでチェックボックスの値...
-
メソッド宣言の戻り値の型にク...
-
abstract と static を一緒に付...
-
return new使用時
-
Javaの関数名が長い?
-
メソッドの引数に指定されてい...
-
クラスを作るとメソッドの数が...
-
public static void main (Stri...
-
説明文書でのメソッド・変数の...
-
readLine()ではじめから読み直...
おすすめ情報