5

これらのオンライン Java テストの 1 つを行っていたところ、次の質問を受けました。

Q: 正しい割り当てを示してください:

Long l = 1; 
Double d = 1;
Integer i = 1;
String s = 1;
Object o = "1";
System.out.println(o);
o = 1;
System.out.println(o);

先に進む前に、自分で試してみてください。

間違っていたと言えます。調査したところ、次のことがわかりました。

//Long l = 1; //cannot widen and then box
Long ll = 1L;//no need to widen, just box
//Double d = 1;//cannot widen and then box
Double dd = 1d;//no need to widen, just box
Integer i = 1;//no need to widen, just box
//String s = 1;//cannot do implicit casting here

Object o = "1";//this compiles and is just plain weird 
System.out.println(o);//output is 1
o = 1;//this also compiles and is also weird 
System.out.println(o);//output is 1

誰かが理由を教えてもらえますか:

Object o = 1;Object o = "1";

どちらの場合もコンパイルして1を出力しますが、これは私を困惑させます。

どうもありがとう

4

5 に答える 5

9

"1"はStringクラスのインスタンスであり、StringはJavaのObjectクラスのサブクラスです(他のクラスと同様)。1は整数にボックス化され、これもオブジェクトから派生します。

于 2010-02-27T08:06:42.113 に答える
3

"1"は のインスタンスでStringあり、1.51は に対して自動ボックス化可能であるためですInteger。どちらのタイプも のサブタイプですObject。オートボクシングが導入される前は、Object o = 1;コンパイルできませんでした。

この学習経験を最大限に活用するには、ObjectgetClass()方法に注意する必要があります。を追加するSystem.out.println(o.getClass().getName())と、 によって参照されるオブジェクトがo属するクラスの名前も出力できます。あなたの場合、それらはjava.lang.String(for (Object) "1") とjava.lang.Integer(for (Object) 1) です。

完了するために、あなたもできるようになったことに言及する必要がありますObject o = false;

于 2010-02-27T13:17:26.803 に答える
1

さて、最初のケース「1」はStringリテラルであるため、オブジェクトのサブクラスであるため、それに割り当てることができます。文字列として、1の出力は比較的単純です。

2番目のケースでは、自動ボクシングが発生しています。Integerオブジェクトのサブクラスであるため、オブジェクトに割り当てることができます。同様に、1の出力は完全に理にかなっています。

于 2010-02-27T08:07:36.983 に答える
1

これは、oがタイプであるためですObject。Javaのすべてのオブジェクトは、クラスを拡張しObjectます。だから...あなたが言うとき、それは1をからにObject o = 1変換します、それはです。同様に、「1」は。です。どちらの場合も、 invokeを呼び出すとsメソッドが呼び出されます。どちらの場合も、1が出力されます。intIntegerObjectStringObjectSystem.out.printlnObjectObjecttoString

于 2010-02-27T08:11:56.783 に答える
1

You can put Object o = anything; where anything is any object because all classes derive from the Object class. It works with primitives because of autoboxing feature which came in java 1.5.

于 2010-02-27T08:18:29.037 に答える