【问题标题】:How to call Super class overridden method with child class object without using super keyword? [closed]如何在不使用 super 关键字的情况下使用子类对象调用超类覆盖方法? [关闭]
【发布时间】:2012-08-05 17:17:52
【问题描述】:

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 关键字。

【问题讨论】:

  • 你试过一个例子吗?如果是这样,请将其发布并让我们知道您在哪里遇到问题。
  • 为什么不想使用 super 关键字?你让我们玩这个游戏的目的是什么?
  • 是的,我做到了,我有三个类,分别称为 First、Second 和 Third,Second 扩展了 First,Third 扩展了 Second。每个类都有一个方法void show(),我制作了第三类的对象t,我想用对象t调用并打印第二类的show()方法。我该怎么做@thinksteep
  • @HovercraftFullOfEels 我的老师要求我并告诉我不要使用 super 这样做,这就是原因。
  • 这几乎就像在问“如果我打断了一只小狗的腿,我还能教他玩取物吗?”。我的问题是:“为什么要打断他的腿?”

标签: java


【解决方案1】:

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

那么不,在 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
    }

}

【讨论】:

  • 啊,所以这就是他在说什么! +1
  • 好吧..你怎么能这么自信地说呢?
  • @P3M 这是一个难题。这是super 的文档。也就是说,我处于这个位置,我知道(从阅读中)该语言可以做什么(不仅仅是超级),但我永远不能完全确定它不能做没有记录的事情。也许你的老师想听听反射。反射允许你访问私有方法和属性,它也可能允许你做老师想做的事情。从这个角度来看,你可以告诉他,如果你使用 C,你几乎可以用你的 java 类做任何事情。
  • @P3M 查看我的其他答案,了解为什么 java 不允许这样做。
【解决方案2】:

是的,这里有一个覆盖方法的示例:

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

【讨论】:

  • 这种方式只能调用上一级的方法。我想问题不止一个层次。就像 super.super.foo()。我相信这是不可能的。
  • 我没有发现它有用..因为它使用超级关键字。
【解决方案3】:

您可以使用super.overriddenMethod(),只要您在子类本身内部调用它。

【讨论】:

  • 是的,我知道,但问题是我不允许使用 super 关键字,现在怎么办?
【解决方案4】:

也许你想要这样的东西:

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 开发人员不允许它的原因。

【讨论】:

  • @P3M 通过编辑我的答案回答了这个问题...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
相关资源
最近更新 更多