你把我搞胡涂了,你是想说应该调用Super::methodA而不应该调用SubClass::methodA是吗?原因是Java 中一切方法缺省都等同于C++中的virtual函数,这种调用方法正是C++中virtual的原意呀,就是可以不用管实际类型是什么,只要用基类指针去引用方法,就会自动调用适当的子类中的相同方法。
解决方案 »
- lucene索引出错 checksum mismatch in segments file
- Eclipse链接SQL Server 2005 语句
- 在fedora core 10下,安装jdk1.6如何设置环境变量?
- 一个聊天程序每个客户端不能显示大家说的话?
- help!在客户端如何通过程序的代码,实现某网页表单的提交
- java重复写文件问题
- 一个有问题的程序帮忙修改下
- 求助:请问在swing界面中怎样设置一个textfield的输入法的状态
- sos我的机器
- Java程序编译成???
- java没有多继承,用接口来实现多继承的功能,但哪里体现了多继承啊?我对接口的概念一直弄不清楚,请大家帮忙!
- 请教高手,如何在java中调用其他应用程序(该程序主要进行数据库操作)
Super::methodASuper::methodB call Super::methodASuper::methodASuper::methodB call Super::methodASubClass::methodB call Super::methodA请高手指点!
去好好看看MFC中对virtual的使用吧!
我想这是java的一个bug,大家看呢?
不相信去C++中试一下。在C++中不用virtual来声明super::methodA()的话,needle说的才对!
I am sorry!你说的对,给你加18分(我在c++中调试时,打错一个字符!)
下面还有问题呢,这么办呢
那有什么方法可以调用Super::methodA而不是调用SubClass::methodA
你说的对,我在C++调试是把Super::methodB()打成Super::methodA啦(真该死),java中实现的方法确实象C++中的虚拟函数,因为所有的方法都是动态绑定的吗!下面这个问题,在java中这么实现:
我想在调用SubClass的methodB时,象C++一样,得到这个结果:
Super::methodA
Super::methodB call Super::methodA
SubClass::methodB call Super::methodA
该这么办
先给你加18分,你说出了是什么原因,但是还没答出如何解决呢,^_^
public void methodA() {
System.out.println("Super::methodA");
}
public void methodB() {
methodA(); //大家注意这里
System.out.println("Super::methodB call Super::methodA");
}
}class SubClass extends Super {
public void methodA() {
super.methodA();
System.out.println("SubClass::methodA");
}
public void methodB() {
super.methodB();
System.out.println("SubClass::methodB call Super::methodA");
}
}
public class Test
{
public static void main(String[] args) {
Super a = new Super();
SubClass b = new SubClass();
a.methodB();
b.methodB();
}
}输出结果是:
Super::methodA
Super::methodB call Super::methodA
Super::methodA
SubClass::methodA
Super::methodB call Super::methodA
SubClass::methodB call Super::methodA
to:luodi问题找出原因啦,先给你加18分
上面的这半个问题,有办法吗!
你不能更改我的SubClass的methodA(),那就达不到我的原意啦
所以一个合理的做法确实是:不是动态绑定,而直接用重载就是了,也就是用wxyxl说的从参数上区别,因为,overload与virtual是完全不同的。
那我的程序,还能看吗!我把下半个问题,又提了一下,欢迎大家讨论!
什么叫“还能看吗!”?
其实什么东西只要能实现就可以!难道你要
SUN把它重写一下!可能重写以后,你已经不用
了,有什么意义呢!既然他本身不支持,难道
我不可以想别的办法!”条条大路通北京“没听说过吗?
class Super {
public static void methodA() {
System.out.println("Super::methodA");
}
public void methodB() {
methodA(); //大家注意这里
System.out.println("Super::methodB call Super::methodA");
}
}class SubClass extends Super {
public static void methodA() {
System.out.println("SubClass::methodA");
}
public void methodB() {
super.methodB();
System.out.println("SubClass::methodB call Super::methodA");
}
}
public class Test
{
public static void main(String[] args) {
Super a = new Super();
SubClass b = new SubClass();
a.methodB();
b.methodB();
}
}
输出结果是:
Super::methodA
Super::methodB call Super::methodA
Super::methodA
Super::methodB call Super::methodA
SubClass::methodB call Super::methodA
但是我不知道为什么把方法设置为静态的,他就去调用父类的方法:
大家讨论一下!
因为一个方法如果用static来声明,它实际上与一个全局函数没什么差别,你把它放在一个类中纯粹是为了使用类的命名空间。
Super::methodB call Super::methodA
Super::methodA
Super::methodB call Super::methodA
SubClass::methodB call Super::methodA
{
private void ma1() //注意不是public
{
list1.addItem ("a1------ma1");
}
public void ma2()
{
ma1();
list1.addItem ("a1-------ma2");
}
} class a2 extends a1
{
public void ma1()
{
list1.addItem ("a2-------ma1");
}
public void ma2()
{
super.ma2();
list1.addItem ("a2-------ma2");
}
} //a1 tmp1=new a1();
a2 tmp2=new a2();
//tmp1.ma1();
//tmp1.ma2();
//tmp2.ma1();
tmp2.ma2();sun的java没问题,她OOP很好,各中原因自己去想!
注意private 而不是public
所以要让虚拟机按照意图执行,要用static,在编译时就绑定,这就是所谓的前期绑定,编译原理讲得很清楚
^v^
public void methodA() {
System.out.println("Super::methodA");
} public void methodB() {
methodA(); //大家注意这里
System.out.println("Super::methodB call Super::methodA");
}
}class SubClass extends Super {
public void methodA() {
System.out.println("SubClass::methodA");
} public void methodB() {//既然是Override,为什么还留有Super.methodB()的痕迹?
//我认为这里不会再象Super的methodB()一样去调用自己的
//methodA().
super.methodB();
System.out.println("SubClass::methodB call Super::methodA");
}
}
public class Test
{
public static void main(String[] args) {
Super a = new Super();
SubClass b = new SubClass(); a.methodB();
b.methodB();
}
}
public void methodA() {
System.out.println("Super::methodA");
} public void methodB() {
methodA(); //Step 2. Here, methodA() is overide by SubClass.
//So, call SubClass's methodA().
System.out.println("Super::methodB call Super::methodA");
}
}class SubClass extends Super {
public void methodA() {////Step 3
System.out.println("SubClass::methodA");
} public void methodB()
super.methodB(); //Step 1
System.out.println("SubClass::methodB call Super::methodA");
}
}
public class Test
{
public static void main(String[] args) {
Super a = new Super();
SubClass b = new SubClass(); a.methodB();
b.methodB();
}
}
1) public(and friendly) methods in java default to polymorphic (virtual in c++)
2) If no explicit method call, all those method will be called dynamically (that is Late binding)In you code:
1)You explicitly call super.methodB(), so compiler knew the binding information and compiler will make early binding for this call.
2)However, in methodB()of Super class, you call methodA() which should be bound at run time in terms of offset in dynamic address table(say VTable in c++).
So, at run time, when you call methodB on Derived class, it will call overriden methodA() of Derived class dynamically.