-1

クラスと、最初のクラスの拡張であるmyClass12 番目のクラスがある場合、次のソース コードがあります。myClass1Extended

myClass1 c1 = something();   // line 1
myClass1Extended c1ex = somethingElse();   // line 2
if (c1ex instanceof myClass1) {    // line 3
    (myClass1)c1ex.doSomething();    // line 4
}

いくつかの質問を聞きたいんです:

  1. 行 3 で、演算子はinstanceoftrue を返しますか?
  2. 4 行目で、最初の答えが「はい」の場合、myClass1Extended で doSomething() がオーバーライドされていない場合はどうなりますか?
  3. doSomething() がオーバーライドされた場合はどうなるでしょうか?
  4. 4行目、(myClass1)は必要ですか?

どうもありがとうございました

4

2 に答える 2

3

コードを見てみましょう。

  1. はい
  2. 親クラスのものを呼び出します
  3. 子クラスのものを呼び出します
  4. 番号。

与えられた:

class Parent
{
    public void foo() 
    {
        System.out.ptintln("parent::foo");
        bar();
    }

    public void bar()
    {
        System.out.println("parent::bar");
    }
}

class Child
    extends Parent
{
    public void foo() 
    {
        super.foo();
        System.out.ptintln("child::foo");
    }
}

すべての子は親の型であるため、親クラスを使用する場所ならどこでも子クラスを使用できます。

コンパイラがこのコードを見ると:

Parent p = new Child();

子が親を拡張または実装していることを確認します。

コンパイラがこのコードを見ると:

p.foo();

pとして宣言されている型にメソッドParentがあることを確認します。foo

実行時にp.foo()行が実行されると、仮想マシンpは実際に指している型をChild調べ、そこでfooメソッドを探します。メソッドfooが見つかったChild場合はそれを実行し、それ以外の場合はParentクラスを調べます。

親クラスでは、fooメソッドがコンパイラを再度呼び出すときに、クラスにメソッドがbarあることを確認します。実行時に、VM は再度クラスを参照してメソッドを探しますが、そうでないため、.xml 内のクラスを呼び出します。ParentbarChildbarParent

メソッドがParentに存在しない場合は、 の親クラスに まで存在する必要がありParentますjava.lang.Object

于 2013-10-13T16:33:34.480 に答える