4

次のような新しいオブジェクトを作成するときのことを理解しています。

GeomObject tri = new Triangle();

はより一般的で再利用性が高くなりますが、tri を次のように作成するとどうなりますか。

Triangle tri = new Triangle();

Triangle は GeomObject のサブクラスなので、tri はまだ GeomObject ではありませんか? 宣言された型はコンパイルにどのように影響しますか? ありがとう

*追加: 追加の質問: 私が持っていると言う

Integer n1 = new Integer(3);
Object n2 = new Integer(4); 
System.out.println(n1.compareTo(n2));

これを Eclipse で試してみたところ、n1 と n2 を逆にしてもエラーが発生しました。n2.compareTo(n1) はオブジェクトのcompareToメソッドを呼び出すため機能し、Integerはオブジェクトのインスタンスであるため通過できると思いましたが、そうではありません。これについて説明していただけますか?

4

1 に答える 1

11

Triangleは のサブクラスなのでGeomObjecttriまだGeomObject?

はい、そうです。instanceof演算子を使用してこれをテストします。

System.out.println( (tri instanceof Triangl) ); //prints true
System.out.println( (tri instanceof GeomObject) ); //prints true
System.out.println( (tri instanceof Object) ); //prints true because every class extends from Object

宣言された型はコンパイルにどのように影響しますか?

.ではない別の実装を使用する必要がある場合に備えて、コードの柔軟性が失われるだけです。GeomObjectTriangle

より詳しい情報:


メソッドn2.compareTo(n1)を呼び出すので、うまくいくと思いましたObject#compareTo

Objectクラスにはメソッドがないため、これは正しくありませんcompareTo

一方、別のクラス型を受け取ったときにメソッドにn1.compareTo(n2)を渡しているため、機能しません。ObjectcompareToInteger#compareToInteger

これを宣言するときは、次のことに注意してください。

Object n2 = new Integer(4);
  • 変数の型はObject、 として初期化するIntegerか、別のクラスなどに初期化しても、 になりますString
  • オーバーライドされたメソッドのみがオブジェクト参照ランタイム タイプで定義されたとおりに動作します。つまり、n2変数が を保持している場合、クラスからクラスIntegerでオーバーライドされたメソッドのみがクラスで定義されたとおりに動作し、他のすべてのメソッド、フィールド、さらには変数も動作します。自体は のように動作します。クラスの場合、これらのメソッドは、およびです。IntegerObjectIntegerObjectIntegerequalshashCodetoString
  • 上記のリンク: 「インターフェイスにプログラムする」とはどういう意味ですか? インターフェース (または抽象クラスまたはジェネリック クラス) を使用して、直接実装する代わりにジェネリック インターフェイス/クラスを介して作業を一般化する利点について説明します。このアプローチが適用されない場合があることに注意してください。たとえば、現在の例ではObjectwhen you should use を使用していますIntegerObjectclass は一般的すぎることに注意してください(少なくともこの場合)。そのためObject、少なくとも実際に何をしているのかを理解するために、直接使用することはお勧めしません。
于 2013-09-12T22:04:48.097 に答える