繁体   English   中英

有没有办法从java中的子类对象调用父类方法而不修改方法

[英]is there any way to call parent class method from child class object in java without modifying methods

我有父类和子类,都有一个方法m1具有相同的签名(覆盖),我可以在下面的场景中调用父类方法。 我不想改变子类方法。

// 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?

在创建Object时,您使用的是Super类的引用,但您的对象是子类,因此在调用m1()方法时,将调用覆盖的方法。 如果你想调用超类的方法,那么object应该是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[]{}                  ) ;

}
}

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

1.)父类的crate对象为

父p = new Parent();

2.)在子类方法中使用super作为

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

在不更改代码的情况下,您无法执行此操作。 你基本上是在谈论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;
     }
}

这是一个纯粹的学术练习 - 我想不出在现实世界中这样做的一个好理由。 如果您使用的是OO语言,请不要与OO范例作斗争!

如果你不能使用super那么你可以直接使用而不是创建子类对象

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

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

除了已经提到的方法之外,您可以将这两个方法声明为static。

所以当你这样做时, Parent p = new Child(); p.m1(); Parent p = new Child(); p.m1();

将调用父类的静态方法,输出将为“父方法”

注意: Java中的static关键字表示变量或函数在该类的所有实例之间共享,因为它属于类型,而不是实际的对象本身。 所以如果你有一个变量:private static int i = 0; 并且在一个实例中递增它(i ++),更改将反映在所有实例中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM