Triangleは のサブクラスなのでGeomObject、triまだ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 を使用していますInteger。Objectclass は一般的すぎることに注意してください(少なくともこの場合)。そのためObject、少なくとも実際に何をしているのかを理解するために、直接使用することはお勧めしません。