三代重载,怎样调用第一代?
class A {
void disp() { println("A");}
}
class B extends A {
void disp() { println("B");}
}
class C extends B {
void disp() { 这里怎样调用 A.disp() ? }
} --------------------编程问答-------------------- 实例化一个A的对象,A a = new A(); 通过对象来调 --------------------编程问答-------------------- 哈哈,lz这个问题问得不错,学习和工作中也没有遇到过这样的问题,引发了思考,我也是第一次听你提这个问题,不过还是有办法解决的,我跟lz分享一种解决方案,利用反射:
lz可以先自己独立实现,然后参考下面代码:
class C extends B {
void disp() {
try {
Class<?> clazz = getClass().getSuperclass().getSuperclass();
clazz.getDeclaredMethod("disp")
.invoke(clazz.newInstance());
} catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException | NoSuchMethodException
| SecurityException | InstantiationException e) {
e.printStackTrace();
}
}
}
楼主学习进步! --------------------编程问答-------------------- class C extends B{
void disp(){
A a = new A();
a.disp();
}
}
--------------------编程问答-------------------- #1,#3 是不对的,没考虑到成员变量。new 得到的成员,已经不是 this的成员了。
我试过在C的disp(){ A a = (A)(this)}; 编译通过,但执行时出错。
谢谢2#, 我真是吓一跳,在C++中 只要 A::disp() 就可以了。
这个要求,在我们在工程中是普遍的,难道Java 没有直到接的支持吗? --------------------编程问答-------------------- 最好在子类中增加调用父类方法的方法
--------------------编程问答-------------------- 想法多样是好的,
class A {
void println(String str) {
System.out.println(str);
}
void disp() {
println("A");
}
}
class B extends A {
void superDisp() {
super.disp();
}
void disp() {
println("B");
}
}
class C extends B {
@SuppressWarnings("unused")
public static void main(String[] args) {
C c=new C();
c.disp();
}
void disp() {
super.superDisp();
}
}
不过想的有点多。
另外这是叫重写,不是叫重载,这点还是要区分清楚的,java面试经常被问到。
B类其实没有用到disp()这个方法,所以实际中是不应该被重写的
如果B类不重写disp()的话,那么C中super.disp();调用的就是A类的。。 --------------------编程问答-------------------- 1楼和3楼有何不对的。。。照样可以调用A中的方法。。。
还有楼上说的对,
这叫重写不叫重载。。。。 --------------------编程问答-------------------- 和楼主一起进步~~~ --------------------编程问答--------------------
恕在下直言,2楼也是创建的新对象,clazz.newInstance(). --------------------编程问答-------------------- 怎么可能会用到这种东西?如果有用到,说明你的代码要重新设计了。不妨拿出来给大家提提意见如何重构吧 --------------------编程问答-------------------- 这种设计有问题,不过非得要这样做的话可以通过反射来做的 --------------------编程问答-------------------- invokedynamic 指令可以实现 jdk 1.7 加入的新特性 --------------------编程问答--------------------
为毛我用他们的方法能行啊!!!???你试没? --------------------编程问答--------------------
本来就可以~ --------------------编程问答--------------------
#1,#3 是不对的,没考虑到成员变量。new 得到的成员,已经不是 this的成员了。
我试过在C的disp(){ A a = (A)(this)}; 编译通过,但执行时出错。
谢谢2#, 我真是吓一跳,在C++中 只要 A::disp() 就可以了。
这个要求,在我们在工程中是普遍的,难道Java 没有直到接的支持吗?
为毛我用他们的方法能行啊!!!???你试没?
本来就可以~
是可以啊 --------------------编程问答-------------------- overload,override搞清先 --------------------编程问答--------------------
overload,override搞清先
恩,重写还是重载需要认真考虑一下
补充:Java , Java SE