2

Javaの子クラスオブジェクトを使用して親クラスのオーバーライドされたメソッドを呼び出すことはできますか?

以下の例を試してみました

class First1
 {
   void show()
    {
    String msg="You are in first class";
    System.out.println(msg);
    }
 }   
 class second extends First1  
 {  
   void show()  
   {  
   String msg="You are in second class";  
   System.out.println(msg);          }  
   }  
 }
 class CallingMethod extends second  
 {  
   void show()  
   {  
    String msg="You are in the third class";  
    System.out.println(msg);  
   }  
    public static void main(String[] args)  
    {  
    CallingMethod cm=new CallingMethod();  
    cm.show();  
    }  

}

「私はセカンドクラスです」と印刷できるかどうか教えてください。ここでは例としてcmであるCallingMethodクラスのオブジェクトを使用し、どこにもスーパーキーワードを使用しません。

4

4 に答える 4

4

サブクラスの外部からメソッドを呼び出すつもりだと思います。

その場合、いいえ、Javaでは不可能です。オーバーライドされたメソッドは、新しいクラスにとって意味のある変更された動作を意味するためです。

クラス内では、どのような場合でもsuperキーワードを使用します。

注:Reflectionを使用すると、言語自体では許可されていないオブジェクトで処理を実行できます。

注:Reflectionを使用してこれをテストしましたが、機能しません。しかし、CをJNIで使用すると、それができる可能性があります...

//does not work
class YourClass
{
    public static void main(String[] args) throws SecurityException,
            NoSuchMethodException, IllegalArgumentException,
            IllegalAccessException, InvocationTargetException
    {
        CallingMethod cm = new CallingMethod();
        First1 f = new First1();
        // Method m = First1.class.getDeclaredMethod("show");
        Method m = First1.class.getMethod("show");
        m.invoke(f);
                    //output: You are in first class
        m.invoke(cm);
                    //output: You are in the third class
    }

}
于 2012-08-08T14:56:54.233 に答える
0

はい、ここにメソッドをオーバーライドする例があります:

http://www.cs.umd.edu/~clin/MoreJava/Objects/overriding.html

于 2012-08-08T14:57:12.777 に答える
0

super.overriddenMethod()子クラス自体の中で呼び出している限り、使用できます。

于 2012-08-08T15:01:24.040 に答える
0

多分あなたはこのようなものが欲しいでしょう:

class A
    method()
class B extends A
    method()
class C extends B
    method()
    {
        //call A.method()
    }

これはJavaでも不可能です。直接スーパークラスのメソッドのみを呼び出すことができます。そして、あなたはいつも使う必要があります

super

編集:そしてこれが理由です:

class A
{
  private int positionA;
  void move()
  {
    positionA++;
  }
  int getPosition()
  {
    return positionA;
  }
}
class B
{
  private int positionB;

  void move()
  {
    positionB++;
  }
  int getPosition()
  {
    return positionB;
  }
}
A a = new A()
B b = new B()

実行した場合

b.move()

次に、positionBがインクリメントされます。getPosition()の呼び出しから期待するものが得られます。

実行できた場合

A.move() 

bに

positionAをインクリメントします。したがって、b.getPosition()を呼び出しても、正しい位置は返されません。

あなたが持っていた場合

Class C extends B

呼び出すことができれば、Bのmove()をバイパスします

A.move()

の上

this. 

クラス外と同じ問題です。あなたのクラスは奇妙に振る舞うでしょう、そしてこれがJava開発者がそれを許可しなかった理由です。

于 2012-08-08T15:06:43.417 に答える