2015-05-06 59 views
2

我有父类和子类,两个具有相同签名(覆盖)的方法m1,我可以调用父类方法以下情景。我不想更改子类方法。是否有任何方法从java中的子类对象调用父类方法没有修改方法

// Super class 
public class Parent 
{ 
    public void m1() 
    { 
     System.out.println("Parent method"); 
    } 
} 
// Sub class 
public class Child extends Parent { 
    @Override 
    public void m1() { 
     System.out.println("Child method"); 
    } 
} 
// User class 
public class Kavi { 
     public static void main(String[] args) { 
      Parent p = new Child(); 
      p.m1(); 

     } 
} 

我想调用父类m1方法。我知道我可以在子类方法中使用super来调用它的父方法。但我无权更改子类的源代码。我必须从子类对象调用它。请任何人帮忙!在java中可能吗?

回答

2

在创建Object时,您使用的是Super类的引用,但您的对象是子类,因此在调用m1()方法时,将调用覆盖的方法。如果你想调用super classto的方法,那么对象应该是Super类。正如:

Parent parent=new Parent(); 
parent.m1(); 

或者

可以调用从子类的超类M1()方法。

@Override 
public void m1() { 
    super.m1(); 
    System.out.println("Child method"); 
     } 

否则后果自负:

import java.lang.reflect.*; 
class A { 
    public void method() { 
     System.out.println("In a"); 
    } 
} 
class B extends A { 
    @Override 
    public void method() { 
     System.out.println("In b"); 
    } 
} 
class M { 
    public static void main(String ... args) throws Exception { 
     A b = new B(); 
     b.method(); 

     b.getClass() 
    .getSuperclass() 
    .getMethod("method", new Class[]{}) 
    .invoke( b.getClass().getSuperclass().newInstance() ,new Object[]{}     ) ; 

} 
} 
+0

我知道这两种方式。我已经提到了问题本身。我的查询是如果有任何其他方式来调用父类方法 –

+0

@kavitemre您可以通过传递参数可以自定义m1()方法可以是布尔值,它可以决定是调用父方法还是执行子方法。但我没有其他可能的办法。 –

+0

@ kavi也许你应该重新思考你的问题,如果这些解决方案中的任何一个都行不通的话。另一个不太合适的解决方案是使用反射......但我不会推荐它。 – Pumphouse

3

我认为这是不可能的。有两种方法来调用一个父类的方法

1)板条箱对象的父类的作为

父p值=新父();

2)使用儿童超作为

@Override 
    public void m1() { 
     super.m1(); 
     System.out.println("Child method"); 
    } 
+1

我不想包装父类的对象 –

+1

@ kavitemre那么这是不可能的,只有2种方法!你不想使用它们中的任何一个。 –

+0

@Neeraj Jain我知道这两种方式。我已经提到了问题本身。我的查询是,如果有任何其他方式来调用父类方法 –

0

如果您不能使用super然后,而不是创建子类对象的类方法可以直接使用

Parent p = new Parent(); 
p.m1(); 

如果你甚至不能修改main方法中的代码,那么我认为这是不可能的。

+0

我不想包装父类的对象。我可以改变我的主要方法。如果需要,我也可以创建另一种方法。 –

3

在不改变代码,你不能做到这一点。你基本上谈论的是p.super.m1()这在Java中是不合法的。如果你想要你的父母像父母一样行事,不要让它成为一个孩子。

如果父母和孩子都是无状态的,您可以在其上创建一个门面并明确管理状态;这会工作,但我不会推荐它。

public class Facade extends Parent { 

    public enum State {PARENT, CHILD}; 

    private final Child delegate; 

    private State state = State.CHILD; 

    public Facade(Child delegate) { 
     this.delegate = delegate; 
    } 

    @Override 
    public void m1() { 
     if (State.CHILD == state) { 
      delegate.m1(); 
     } else { 
      super.m1(); 
     } 
    } 

    public void setState(State state) { 
     this.state = state; 
    } 
} 

这是一个纯粹的学术练习 - 我想不出在现实世界中做到这一点的一个很好的理由。如果你使用的是面向对象的语言,那么不要去面对面向对象的范例!

+0

史蒂夫我试着用你的课,但它仍然在调用子类m1方法。 –

+0

您是否使用setState(Facade.State.PARENT)将其切换到父级模式? –

+0

我已经使用您的课程如下 \t \t Child ch = new Child(); \t \t Facade f = new Facade(ch); \t \t f.setState(Facade.State.PARENT); \t \t f.m1(); 但它给了StackOverflow异常。 –

相关问题