1
public class InheritanceDemo {

    public static void main(String[] args) {

        ParentClass p = new ParentClass();
        ChildClass c = new ChildClass();

        //Casting ChildClass to ParentClass
        ParentClass pc = new ChildClass();
        pc.parentClassMethod(); //Output: Parent Class Method (as expected)

        //Again Casting Parent Class to ChildClass explictly
        //Question 1 for this code
        ChildClass cp = (ChildClass) pc;
        cp.parentClassMethod(); //Output: Parent Class Method (unexpected)

        ChildClass cc1 = (ChildClass) new ParentClass();
        cc1.parentClassMethod(); //Compiles, but Run Time Error

        ChildClass cc2 = (ChildClass) p;
        cc2.parentClassMethod(); //Compiles, but Run Time Error

    }
}

class ParentClass {

    public void parentClassMethod(){
        System.out.println("Parent Class Method");
    }

}

class ChildClass extends ParentClass {

    public void ParentClassMethod(){
        System.out.println("Parent Class Method From Child Class");
    }

    public void ChildClassMethod(){
        System.out.println("Child Class Method");
    }

}

質問1:

これで、クラス(オーバーライド)parentClassMethodの両方ParentClassで呼び出されるメソッドがあります。toChildClassをキャストしてからparentClassMethodを呼び出すと、 cpが参照している場合のメソッドの代わりにメソッドを実行するのはなぜですか?ParentClassChildClassParentClassChildClassChildClass

質問2:

(私)ChildClass cp = (ChildClass) pc;

(ii)ChildClass cc1 = (ChildClass) new ParentClass(); (iii)ChildClass cc2 = (ChildClass) p;

(i)が正常に機能している場合は、(ii)または(iii)を使用しないのはなぜですか?

どちらの場合もからParentClassにキャストしているので?ChildClass

4

2 に答える 2

1

これで、ParentClassクラスとChildClassクラスの両方にparentClassMethodというメソッドがあります(オーバーライド)。

いいえ、しません。で名前が付けられたメソッドとで名前が付けparentClassMethodられParentClassたメソッドがParentClassMethodありChildClassます。すべてのJava識別子は大文字と小文字が区別されるため、2つの間に関連付けはありません。 からParentClassMethodオーバーライドしません。parentClassMethodParentClass

(i)が正常に機能している場合は、(ii)または(iii)を使用しないのはなぜですか?

(ii)と(iii)では、のインスタンスをのインスタンスにキャストしようとしてParentClassいますChildClassChildClassis-not-aParentClassであるため、これObjectは許可されていませんString

ChildClass(i)では、 (として宣言された参照に格納されているParentClass)のインスタンスをにキャストしようとしていますChildClass。これは許可されています。

キャストする場合、カウントされるのはランタイムタイプです(つまり、Tで使用されるものnew T())。

于 2013-01-19T07:23:09.017 に答える
0

ジェネリックがなかったときのjdk1.4に戻りましょう。

  Vector test = new Vector();
   test.add("java");

今あなたがしていることを検索している間:

String str = (String) test.get(0);

したがって、文字列は最初はベクトル内のオブジェクトとして格納されていましたが、次に文字列にダウンキャストすると問題なく動作しました。

しかし、フォローしようとしても機能しません。

String str = (Object) new Object();

したがって、最初のケースでは文字列でしたが、参照はオブジェクト[ベクトル内]であったことがわかります。このシナリオでは、ダウンキャストでき、機能します。

最初の質問に答えるために、Javaは大文字と小文字を区別し、メソッド名の大文字と小文字が一致しません。

于 2013-01-19T07:48:12.507 に答える