代码之家  ›  专栏  ›  技术社区  ›  bdhar

使用子类对象访问超类函数

  •  5
  • bdhar  · 技术社区  · 16 年前

    我有一个子类的对象扩展它的超类。子类中有一个重写的方法,可以使用该对象调用该方法。 是否可以使用子类对象调用超类的函数?

    package supercall;
    
    public class Main {
    
        public static void main(String[] args) {
            SomeClass obj = new SubClass();
            obj.go();   //is there anything like, obj.super.go()?
        }
    
    }
    
    class SomeClass {
        SomeClass() {
    
        }
        public void go() {
            System.out.println("Someclass go");
        }
    }
    
    class SubClass extends SomeClass {
        SubClass() {
    
        }
        @Override
        public void go() {
            System.out.println("Subclass go");
        }
    }
    

    考虑上面的代码。

    这是照片

    子类go

    . 相反,我必须打印

    Superclass去

    .

    5 回复  |  直到 9 年前
        1
  •  15
  •   Michael Borgwardt    16 年前

    不,这是不可能的,如果你认为你需要它,重新考虑你的设计。重写方法的关键是替换它的功能。如果一个不同的类对该类的内部工作知道那么多,那么您就完全破坏了封装。

        2
  •  3
  •   EEE    13 年前

    这是印刷品 子类围棋 . 相反,我必须打印 Superclass去

    好吧,那么不要重写go方法@subclass,它将调用超类实现。

    如果您想要运行超级实现,并且有一些其他附加的代码@subclass,您可以调用super.go();然后运行一些其他语句。

    没关系,因为您在重用已经编写的代码,所以不应该从超类复制粘贴代码并将其放入子类,因为它是代码复制。但如果你的目标是彻底改变行为,那就不要称之为超级

        3
  •  2
  •   Noon Silk    16 年前

    而不是:

    System.out.println("Subclass go");
    

    写

    super.go();
    

    (或者,你知道,不要实现那个方法…)。

        4
  •  0
  •   user159088    16 年前

    有什么方法可以做到这一点吗?不,没有。

    在运行时,JVM将根据实例类型(这对您来说是多态性)选择要调用的方法,而不是基于它声明的类型。

    您的实例是一个子类实例,因此将调用子类中的go()方法。

        5
  •  0
  •   soufrk    10 年前

    一种方法是让子类调用超类实现。但我想这不是你想要的?

    class SubClass extends SomeClass {    
    SubClass() {}    
        @Override    
        public void go() {    
            super.go
        }
    }