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();  
    }  

}

现在告诉我是否可以打印“我在二等舱”。通过使用 CallingMethod 类的对象,即示例中的 cm,并且在任何地方都没有使用 super 关键字。

4

4 回答 4

4

我假设您的意思是从子类外部调用该方法。

那么不,在java中不可能,因为被覆盖的方法意味着改变了对新类有意义的行为。

在类内部,无论如何您都将使用 super 关键字。

注意:使用反射你可以对对象做一些语言本身不允许的事情。

注意:我使用反射对此进行了测试,它不起作用。但是当您将 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

也许你想要这样的东西:

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

它会增加位置A。因此调用 b.getPosition() 不会返回正确的位置。

如果你有

Class C extends B

如果你可以打电话,你会绕过 B 的 move()

A.move()

this. 

这和课外的问题一样。您的类会表现得很奇怪,这就是 Java 开发人员不允许它的原因。

于 2012-08-08T15:06:43.417 回答
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 回答