-3

次のようなコードがあります。

String stringRef = new String("Java");                    // (1)

System.out.println("(2): " + stringRef.getClass());       // (2)
System.out.println("(3): " + stringRef.length());         // (3)

Object objRef = stringRef;                                // (4)

// System.out.println("(5): " + objRef.length());            // (5) Not OK.
System.out.println("(6): " + objRef.equals("Java")); 

ラインで電話できないのはなぜですかlength()(5); equals()行 (6) で呼び出されるクラスはどれですか?

4

6 に答える 6

1

equalsで宣言されてObjectいるので、呼び出すことができます。lengthそうではありません。objRefコンパイラは、 ;によって参照されているオブジェクトタイプを正確に判別しようとはしません。それは、それがオブジェクトであるという知識がある場合にのみ機能します。

Javaコンパイラは、ドット演算子の左側にある式の静的型に基づいて、呼び出すメソッドのシグニチャを静的に解決します。ポリモーフィズムと動的ディスパッチの概念は、呼び出すオーバーライドメソッドの解決にのみ適用されます。

于 2013-01-17T09:49:15.227 に答える
0

コンパイラの場合、はのobjRefインスタンスであり、。Objectという名前のメソッドはありませんlength()。一方、は、から派生し、で継承さequals()れるメソッドであるため、プログラムは正しく動作します。ObjectString

于 2013-01-17T09:49:29.160 に答える
0

length()メソッドはStringsに固有です。これをオブジェクトに割り当てることにより、Javaはそれが文字列であることを認識しなくなります。

古い決まり文句:すべての円は形であり、すべての形が円であるとは限りません。

次のことを行うと機能します。

System.out.println("(5): " + ((String)objRef).length());

ここでは、最初にStringに型キャストしてから、length()を呼び出します。

于 2013-01-17T09:49:58.047 に答える
0

参照がある場合は、パブリックであり、自分自身のメソッドまたはスーパークラスのパブリックメソッドTypeに表示されるメソッドまたはアクセスフィールドのみを呼び出すことができます。TypeTypeType

この場合、Objectはメソッドequalsや他の多くのメソッドを定義するため、それらを使用できます。

于 2013-01-17T09:50:08.187 に答える
0

サブクラスのメソッドはスーパークラスにないため、これを行うことはできません。この場合、String は Object のサブクラスですが、length() は java.lang.Object クラスで宣言されていないため、そのインスタンスで length を呼び出すことはできません。

ただし、 equals() メソッドは文字列クラスでオーバーライドされるため、文字列の equals() が呼び出されます

于 2013-01-17T09:48:56.150 に答える
0

アクセスできるすべてのメソッドを定義するのは、実際のオブジェクトではなく参照のタイプです。そのため、スーパークラス参照がサブクラス オブジェクトを保持していても、スーパー クラス参照を使用してサブクラス メソッドにアクセスすることはできません。

于 2013-01-17T09:50:24.090 に答える