我有多个扩展抽象类A的类。
抽象类具有以下方法:
public abstract int methodOne (int n);
public abstract int methodTwo (int n);
扩展类A的类之一,即类B,覆盖了以下方法之一,例如:
public int methodOne (int n) {
return n * 2;
}
public int methodOne (int n, int k) {
return n * k;
}
现在,我们正在使用类B的实例,是否可以检查方法“ methodOne”是否已重载,然后进行条件检验。
A ourTest = new B();
如果methodOne有两个参数,则将方法与两个参数一起使用,否则,将methodOne与一个参数一起使用。
答案 0 :(得分:1)
您可以使用反射来检查B
声明的方法。请注意,有2种口味:
B.getClass().getMethods()
将为您提供Method
对象的数组,这些对象代表该类的所有公共方法,包括由类或接口声明的对象以及从超类和超接口继承的对象。
您也可以致电
B.getClass().getDeclaredMethods()
将为您提供一个包含Method对象的数组,该对象反映该类的所有已声明方法,包括public,protected,默认(程序包)访问和私有方法,但不包括继承的方法。
并非如此,类A
没有methodOne
的2自变量形式,因此从技术上讲,不能在B
中继承或覆盖它。
因此,您可以调用getDeclaredMethods()
并遍历Method
对象的数组,以查看B
是否具有2个参数形式的methodOne
。
即使您声明了A类型的对象但使用new B()
对其进行实例化,它仍然有效。
以下示例代码显示了它的作用:
public abstract class A {
public abstract int methodOne (int n);
public abstract int methodTwo (int n);
}
public class B extends A {
@Override
public int methodOne(int n) {
return n;
}
public int methodOne(int n, int k) {
return n + k;
}
@Override
public int methodTwo(int n) {
return n * 2;
}
}
// test it out (note that this can throw several different exceptions
// so you'll have to handle them..I left that out to keep the code
// concise.
A a = new B();
Method[] methods = a.getClass().getDeclaredMethods();
for(Method m : methods) {
System.out.println(m.toGenericString());
if(m.getName().equals("methodOne") && m.getParameterCount() == 2) {
int result = (int)m.invoke(a, 3, 2);
System.out.println("Result = " + result);
}
}
这将打印以下内容:
public int B.methodTwo(int)
public int B.methodOne(int,int)
Result = 5
public int B.methodOne(int)
答案 1 :(得分:0)
您没有带有一个或两个参数的相同方法。两种方法虽然名称相同(methodOne),但均不同。如果要查找一个方法有多少个自变量,或者是否要重载该方法,可以使用Java Reflection API。但是您尝试这样做似乎没有任何意义。
答案 2 :(得分:0)
如果
methodOne
有两个参数,则将方法与两个参数一起使用,否则将methodOne
与一个参数一起使用。
不,您不能这样做,因为Java是静态类型的。
由于A
仅定义了methodOne
的单参数版本,所以对于使用A
类型的变量的代码,这就是您所拥有的。
添加到子类中的任何方法在普通Java代码中都不可见,类型为A
的变量。您只能通过强制转换为相关子类或使用反射来调用此类“额外”方法。