2013-09-26 51 views
0

假设我有两个类A和B,其中A是B的超现在,我写一个函数(覆盖),说在两个类本功能()。那么,如果我想从B的对象中调用A中的funct(),有可能吗?调用子类从超类中重写功能JAVA

+0

@ Dukeling我的意思是你不能从对象本身之外调用超类方法。 –

+1

为什么你想这样做呢? – Achrome

+0

@AshwinMukhija我只是想了解实施情况,无论是否可行。 –

回答

0

鉴于类你问

然后,如果我想从B的对象调用A中的本功能(),它是可能 ?

因此,让我们

B b = new B(); 
b.funct(); 
A a = b; 
a.funct(); 
((A)b).funct(); 

以上都这样做,因为多态性与后期绑定的同样的事情。

调用父类的实现的唯一途径是通过super关键字获取对成员的引用。

class A { 
    public void funct() {...} 
} 

class B extends A { 
    @Override 
    public void funct() { 
     super.funct(); 
    } 
} 
+0

所以,我们不能直接通过使用一个对象来调用over-ridden函数,对吧?谢谢您的帮助! –

+0

@DChetan没错。别客气。 –

2
class A { 
    public void f() {...} 
} 

class B extends A { 
    @Override public void f() { super.f(); } 
} 

这就是你想要的吗?

相反,如果你想直接调用A#f()对B型的实例,你必须提供一个占位符的功能:像

class A { 
    public void funct() {...} 
} 

class B extends A { 
    @Override 
    public void funct() {...} 
} 

class B extends A { 
    @Override public void f() { ... } 
    public void superF() { super.f(); } 
} 

new B().f(); // calls B#f(); 
new B().superF(); // calls A#f(); 
1

我有特技如这种情况下,以一个不合逻辑的方式在本功能使用标志的参数(操作它)的方法:d,如下所示:

class A { 

    public void funct(boolean callSuper) { 
     // avoid using callSuper arg here 
    } 
} 

class B extends A { 

    @Override 
    public void funct(boolean callSuper) { 
     if (callSuper) { 
      super.funct(callSuper); 
      return;//if return type is void 
     } else { 
      //do here the functionality if the flag is false 
     } 
    } 
} 

class A { 

    public void funct() { 

    } 
} 

class B extends A { 

    private boolean callSuper = false; 

    @Override 
    public void funct() { 
     if (callSuper) { 
      super.funct(); // call A.funct() functionality 
      setCallSuper(false); 
     } else { 
      //do here the functionality of B.funct() if the flag is false 
     } 
    } 

    public void setCallSuper(boolean callSuper){ 
     this.callSuper = callSuper; 
    } 
}