我有父类和子类,两者都有一个方法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 ??
答案 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 ++),更改将反映在所有实例中。