1
package override;

class Super
{
    public void dosomething()
    {
        System.out.println("hello Super");
    }
}

class sub 
    extends Super
{
    @Override
    public void dosomething()
    {
        System.out.println("hello sub");
    }
}

public class Main 
{
    public static void main(String[] args) 
    {
        Super p1=new Super();
        Super p2=new sub();  // Please explain why this line is correct as constructor and //class name should be same
        p1.dosomething();
        p2.dosomething();
    }
}

別のクラス名と別のコンストラクター名でオブジェクトを作成したときにメソッドを呼び出すにはどうすればよいですか? 上で強調表示されたステートメントのように、コンストラクターを呼び出す方法が異なります

4

3 に答える 3

1
 Super p2=new sub();
 p2.doSomething();

これは、ランタイム ポリモーフィズム (メソッド オーバーライド) と呼ばれます。

コンパイラは、変数の型 (つまり、この場合は super) によって定義されたメソッドを呼び出しません。この動作は仮想メソッド呼び出しと呼ばれ、Java 言語の重要なポリモーフィズム機能の側面を示しています。

http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

オブジェクト p2 のタイプは Super です。しかし、p2はサブを参照しています。したがって、コンパイラは実行時にサブクラスで doSomething() を実行します。スーパークラスには doSomething() メソッドがあります。

しかし、サブで eat() と言う場合

Super p2=new sub();
p2.eat(); // not possible

スーパークラスにはメソッド eat() がありません。

于 2013-04-19T04:51:29.063 に答える
0

p2 は、オブジェクト new sub() オブジェクトを参照しているだけです。そして今、p2はスーパークラスにあったメソッドのみを呼び出すことができ、サブはそれらをオーバーライドしました。これがランタイム ポリモーフィズムです。

于 2013-04-19T05:05:20.347 に答える