質問

私はこれらのオンラインのJava試験の一つをやっていたし、私はこの質問をしました。

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

缶誰かのTELL理由ます:

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

コンパイルとどちらの場合も、出力1

、これは私に不可解されます。

多くの感謝

役に立ちましたか?

解決

"1"は、Stringクラスのインスタンスであり、文字列は、Java(他のクラスなど)でのオブジェクトクラスのサブクラスです。 1もオブジェクトから派生される整数、に箱詰めされている。

他のヒント

"1"Stringのインスタンスであるため、1.5 1Integerに自動boxableであるからです。両方のタイプはObjectのサブタイプです。オートボクシングが導入される前は、Object o = 1;がコンパイルされないでしょう。

この学習経験のほとんどのアウトを取得するには、ObjectgetClass()方法に注意する必要があります。 System.out.println(o.getClass().getName())を追加することで、あなたもoによって参照されるオブジェクトが属するクラスの名前を印刷することができます。あなたのケースでは、彼らは(java.lang.String用)(Object) "1"と(java.lang.Integer用)(Object) 1されます。

ただ、完成のために、私はあなたが今もObject o = false;を行うことができますことを言及する必要があります。

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

第2のケースでは、オートボクシングが発生しています。 Integerはそれに従って割り当て可能オブジェクトのサブクラスです。同様に、1の出力は、完璧な理にかなっています。

oがタイプObjectであるため、

このです。すべてのオブジェクトは、Javaで、クラスObjectを拡張します。あなたがObject o = 1を言うときに...、それはintある、IntegerObjectから1に変換します。同様に、「1」StringあるObjectあります。どちらの場合も、System.out.printlnObjectを呼び出すとObjectsのtoStringメソッドを呼び出します。どちらの場合も、それは1を出力します。

あなたは、すべてのクラスがObject o = anything;クラスから派生するのでanythingは任意のオブジェクトであるObjectを置くことができます。それがためにJava 1.5で来た機能をオートボクシングのプリミティブで動作します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top