gpt4 book ai didi

java - 使用反射在没有实例的情况下调用父类(super class)方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:58:44 32 4
gpt4 key购买 nike

请考虑以下演示继承和反射的代码:

    /*Parent class*/

package basics;

public class Vehicle {

private void parentPrivateMethod() {
System.out.println("This is the child private method");
}

public void print() {
System.out.println("This is a Vehicle method");
}

public void overrideThisMethod() {
System.out.println("Parent method");
}

}


/*Child class*/

package basics;

public class Car extends Vehicle {

private void childPrivateMethod() {
System.out.println("This is the child private method");
}

public String returnCarName() {
return "Manza";
}

@Override
public void overrideThisMethod() {
//super.overrideThisMethod();/*NOTE THIS*/
System.out.println("Child method");
}

}


/*Tester class*/
package basics;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class NewTester {

/**
* @param args
* @throws NoSuchMethodException
* @throws SecurityException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws InstantiationException
*/
public static void main(String[] args) throws SecurityException,
NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException, InstantiationException {
// TODO Auto-generated method stub

Car carInstance = new Car();

/* Normal method invocation */
carInstance.overrideThisMethod();

/* Reflection method invocation */
Method whichMethod = Car.class.getSuperclass().getMethod(
"overrideThisMethod", null);
whichMethod.invoke(carInstance, null);

/* Work-around to call the superclass method */
Method superClassMethod = Car.class.getSuperclass().getMethod(
"overrideThisMethod", null);
superClassMethod.invoke(Car.class.getSuperclass().newInstance(), null);
}

}

输出(带有注释的“NOTE THIS”部分)是:

        Child method
Child method
Parent method

如果“注意这个”部分未被注释,父类(super class)方法将被调用,给出输出:

        Parent method
Child method
Parent method
Child method
Parent method

创建 Car 的实例时,首先运行 Vehicle 的构造函数。因此,我相信,也创建了一个 Vehicle 实例,Car 实例通过“super”持有其引用。

问题:如何在不使用/* 变通方法调用父类(super class)方法 */的情况下调用父类(super class)版本的“overrideThisMethod”?

我是否在这里忽略了什么/在这里做出了错误的假设?

最佳答案

When an instance of Car is created, the constructor of Vehicle runs first. Hence, I believe, that an instance of Vehicle is created,too, whose reference the Car instance holds via 'super'.

这不太正确;只创建一个对象。 Vehicle 的构造函数运行是因为它是 Vehicle 和 Car 的实例。没有单独的 Vehicle 对象,super 不是对象引用而是关键字。例如,您不能将 super 作为参数传递给方法。

super 关键字允许您告诉编译器您要从父类(super class)调用方法而不检查该方法是否在子类中被覆盖。为此,编译器使用 invokespecial JVM 指令生成方法调用。通常编译器会发出一条 invokevirtual 指令。

关于java - 使用反射在没有实例的情况下调用父类(super class)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9771933/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com