java.lang.ObjectのO = 1; //なぜこのコンパイルはいますか?
-
23-09-2019 - |
質問
私はこれらのオンラインの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"
は、Stringクラスのインスタンスであり、文字列は、Java(他のクラスなど)でのオブジェクトクラスのサブクラスです。 1
もオブジェクトから派生される整数、に箱詰めされている。
他のヒント
"1"
はString
のインスタンスであるため、1.5 1
はInteger
に自動boxableであるからです。両方のタイプはObject
のサブタイプです。オートボクシングが導入される前は、Object o = 1;
がコンパイルされないでしょう。
この学習経験のほとんどのアウトを取得するには、Object
のgetClass()
方法に注意する必要があります。 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
ある、Integer
にObject
から1に変換します。同様に、「1」String
あるObject
あります。どちらの場合も、System.out.println
にObject
を呼び出すとObject
sのtoString
メソッドを呼び出します。どちらの場合も、それは1を出力します。
あなたは、すべてのクラスがObject o = anything;
クラスから派生するのでanything
は任意のオブジェクトであるObject
を置くことができます。それがためにJava 1.5で来た機能をオートボクシングのプリミティブで動作します。