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

时间:2015-05-06 05:26:28

标签: java oop inheritance

我有父类和子类,两者都有一个方法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 ??

5 个答案:

答案 0 :(得分:6)

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

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

您可以从子类调用超类m1()方法。

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

OR ELSE

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 :(得分:3)

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

1。)父类的crate对象为

父p =新父();

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

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

答案 2 :(得分: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;
     }
}

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

答案 3 :(得分:0)

如果你不能使用import Foundation import CoreLocation public class FrameworkInit : NSObject, CLLocationManagerDelegate { var locationManager = CLLocationManager() var lat = "" var long = "" var locflag = false var _appKey = "" func fetchLocation() { println("fetch loc called....") locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.requestWhenInUseAuthorization() locationManager.startUpdatingLocation() } public func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { var locValue:CLLocationCoordinate2D = manager.location.coordinate lat = locValue.latitude.description long = locValue.longitude.description println("lat.....\(lat) \nlong...... \(long)") self.locationManager.stopUpdatingLocation() if !locflag { SPDeviceRegister().saveDataOnDevice(_appKey, lat: lat, long: long) SPReceiver().thresholdValueSetter() } locflag = true } public func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { println("Error:" + error.localizedDescription) if !locflag { SPDeviceRegister().saveDataOnDevice(_appKey, lat: "0.0", long: "0.0") SPReceiver().thresholdValueSetter() } locflag = true } public init(appKey: String) { super.init() _appKey = appKey self.fetchLocation() } } ,那么你可以直接使用

而不是创建子类对象
super

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

答案 4 :(得分:0)

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

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

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

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