【问题标题】:Call overridden method of super class [duplicate]调用超类的重写方法[重复]
【发布时间】:2014-02-27 11:44:46
【问题描述】:

这个问题是在一次采访中问我的。我的子类中有一个被覆盖的方法。使用子类的实例,我想调用超类的方法。请记住,该方法已被覆盖。

以下代码的输出是NO NO PRINT HI
如果我想使用覆盖类的对象打印Print Hello 怎么办?我该怎么做?

class OverrideSuper {
    public void printHello() {
         System.out.println("Print Hello");
    }
}

public class Overriding extends OverrideSuper {
    public void printHello() {
         System.out.println("NO NO PRINT HI");
    }

    public static void main(String[] args) {
        //OverrideSuper obj1 = new OverrideSuper();
        Overriding obj2 = new Overriding();
        obj2.printHello();// this calls printHello() of class Overriding.
        //I want to call printHello() of OverrideSuper using obj2. How do I do that???
    }
}

【问题讨论】:

  • 你做过研究吗?您通常如何调用父类方法?

标签: java


【解决方案1】:

我认为面试官希望你写另一个调用super.printHello()的方法:

public class Overriding extends OverrideSuper {
    public void printHello(){
         System.out.println("NO NO PRINT HI");
    }
    public void superHello() { // You can make this private or protected, too
        super.printHello();
    }
    public static void main(String[] args) {
        //OverrideSuper obj1 = new OverrideSuper();
        Overriding obj2 = new Overriding();
        obj2.superHello();// this calls printHello() of class OverrideSuper .
    }
}

本质上,他想让你告诉他,一旦方法被覆盖,就无法从外部调用基类的方法。解决这个问题的唯一方法是在覆盖类内部创建一个到超类的调用路径,这就是我在上面通过定义 superHello 方法所做的。

[面试官]说“我不服”

另一种可能是面试官正在寻找您提供基于反射的解决方案,这仅在 Java 7+ 中才有可能。你需要使用MethodHandle,用基类调用findSpecial,然后调用你返回的方法。

Here is a link to an answer that explains the process, and shows an example.

【讨论】:

  • 很奇怪,这就是我实际回答的问题。然而,面试官一直在说“不,不,我想从 obj2 打电话”来激怒我。当我说不可能的时候。他说“我不相信”......任何情况下我都知道我是正确的。非常感谢大家:)祝你有美好的一天...... :)
【解决方案2】:

我认为这将满足您的要求!尝试这个 当您调用 obj2.printHello(); 时,执行将移至 Overridings printHello() 并且在该方法中我使用了 super.printHello(); 这意味着首先调用超类的 printHello() and compiler prints Print Hello 然后再次执行到 Overridings @987654328 @和print NO NO PRINT HI

class OverrideSuper {
    public void printHello() {
        System.out.println("Print Hello");
    }
}
    public class Overriding extends OverrideSuper {
            public void printHello() {
                super.printHello();
                System.out.println("NO NO PRINT HI");
            }

            public static void main(String[] args) {
                // OverrideSuper obj1 = new OverrideSuper();
                Overriding obj2 = new Overriding();
                obj2.printHello();// this calls printHello() of class Overriding.
                // I want to call printHello() of OverrideSuper using obj2. How do I do
                // that???
            }
        }

输出

Print Hello
NO NO PRINT HI

【讨论】:

    【解决方案3】:

    您可以使用 super 关键字来访问父方法。

    class OverrideSuper{
        public void printHello(){
             System.out.println("Print Hello");
        }
    }
    public class Overriding extends OverrideSuper {
        public void printHello(){
            super.printHello();
            //System.out.println("NO NO PRINT HI");
        }
        public static void main(String[] args) {
            //OverrideSuper obj1 = new OverrideSuper();
            Overriding obj2 = new Overriding();
            obj2.printHello();// this calls printHello() of class Overriding.
            //I want to call printHello() of OverrideSuper using obj2. How do I do that???
        }
    }
    

    【讨论】:

    • 您确实可以,但是您的示例基本上没有意义,而不是询问OP的内容。
    • 你能详细说明是什么让它毫无意义吗?
    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 2017-07-07
    • 2018-01-22
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多