当前位置:编程学习 > JAVA >>

三代重载,怎样调用第一代?


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中的方法。。。
还有楼上说的对,
这叫重写不叫重载。。。。 --------------------编程问答-------------------- 和楼主一起进步~~~ --------------------编程问答--------------------
引用 4 楼 neeme 的回复:
#1,#3 是不对的,没考虑到成员变量。new 得到的成员,已经不是 this的成员了。

我试过在C的disp(){ A a = (A)(this)}; 编译通过,但执行时出错。

谢谢2#, 我真是吓一跳,在C++中  只要 A::disp() 就可以了。

这个要求,在我们在工程中是普遍的,难道Java 没有直到接的支持吗? 


恕在下直言,2楼也是创建的新对象,clazz.newInstance(). --------------------编程问答-------------------- 怎么可能会用到这种东西?如果有用到,说明你的代码要重新设计了。不妨拿出来给大家提提意见如何重构吧 --------------------编程问答-------------------- 这种设计有问题,不过非得要这样做的话可以通过反射来做的 --------------------编程问答-------------------- invokedynamic 指令可以实现  jdk 1.7 加入的新特性 --------------------编程问答--------------------
引用 4 楼 neeme 的回复:
#1,#3 是不对的,没考虑到成员变量。new 得到的成员,已经不是 this的成员了。

我试过在C的disp(){ A a = (A)(this)}; 编译通过,但执行时出错。

谢谢2#, 我真是吓一跳,在C++中  只要 A::disp() 就可以了。

这个要求,在我们在工程中是普遍的,难道Java 没有直到接的支持吗? 

为毛我用他们的方法能行啊!!!???你试没? --------------------编程问答--------------------
引用 13 楼 u010131960 的回复:
Quote: 引用 4 楼 neeme 的回复:

#1,#3 是不对的,没考虑到成员变量。new 得到的成员,已经不是 this的成员了。

我试过在C的disp(){ A a = (A)(this)}; 编译通过,但执行时出错。

谢谢2#, 我真是吓一跳,在C++中  只要 A::disp() 就可以了。

这个要求,在我们在工程中是普遍的,难道Java 没有直到接的支持吗? 

为毛我用他们的方法能行啊!!!???你试没?

本来就可以~ --------------------编程问答--------------------
引用 14 楼 u013163230 的回复:
Quote: 引用 13 楼 u010131960 的回复:

Quote: 引用 4 楼 neeme 的回复:

#1,#3 是不对的,没考虑到成员变量。new 得到的成员,已经不是 this的成员了。

我试过在C的disp(){ A a = (A)(this)}; 编译通过,但执行时出错。

谢谢2#, 我真是吓一跳,在C++中  只要 A::disp() 就可以了。

这个要求,在我们在工程中是普遍的,难道Java 没有直到接的支持吗? 

为毛我用他们的方法能行啊!!!???你试没?

本来就可以~

是可以啊 --------------------编程问答-------------------- overload,override搞清先 --------------------编程问答--------------------
引用 16 楼 yzw19932010 的回复:
overload,override搞清先

恩,重写还是重载需要认真考虑一下
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,