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
宣言された型はコンパイルにどのように影響しますか?
.ではない別の実装を使用する必要がある場合に備えて、コードの柔軟性が失われるだけです。GeomObject
Triangle
より詳しい情報:
メソッドn2.compareTo(n1)
を呼び出すので、うまくいくと思いましたObject#compareTo
Object
クラスにはメソッドがないため、これは正しくありませんcompareTo
。
一方、別のクラス型を受け取ったときにメソッドにn1.compareTo(n2)
を渡しているため、機能しません。Object
compareTo
Integer#compareTo
Integer
これを宣言するときは、次のことに注意してください。
Object n2 = new Integer(4);
- 変数の型は
Object
、 として初期化するInteger
か、別のクラスなどに初期化しても、 になりますString
。
- オーバーライドされたメソッドのみがオブジェクト参照ランタイム タイプで定義されたとおりに動作します。つまり、
n2
変数が を保持している場合、クラスからクラスInteger
でオーバーライドされたメソッドのみがクラスで定義されたとおりに動作し、他のすべてのメソッド、フィールド、さらには変数も動作します。自体は のように動作します。クラスの場合、これらのメソッドは、およびです。Integer
Object
Integer
Object
Integer
equals
hashCode
toString
- 上記のリンク: 「インターフェイスにプログラムする」とはどういう意味ですか? インターフェース (または抽象クラスまたはジェネリック クラス) を使用して、直接実装する代わりにジェネリック インターフェイス/クラスを介して作業を一般化する利点について説明します。このアプローチが適用されない場合があることに注意してください。たとえば、現在の例では
Object
when you should use を使用していますInteger
。Object
class は一般的すぎることに注意してください(少なくともこの場合)。そのためObject
、少なくとも実際に何をしているのかを理解するために、直接使用することはお勧めしません。