super是何意思?super只能在constuctor里使用吧?!
解决方案 »
- 两个JAVA的难题,请高手解决一下
- 保存String到文本文件怎么写,网上查了感觉还是不清楚
- java更改文件名的程序,renameTo一直返回false,请各位给看看
- 如何查询数据库中 yyyy-mm-dd 提前 5 天的数据?
- 在被调用对象中得到调用对象实例
- 十万火急,怎样实现点击一个按钮隐藏一个面板,象qq登录时的设置按钮一样!!
- 关于GUI的若干问题
- 急!有关毕业设计的问题,稍微熟悉JBuilder中opentools的请进!
- 今天刚刚买的JB7.0Enterprise,遇到一些问题,请高手赐教...
- 求解析一下这两句Java代码
- 小弟太穷,请别介意只有10分。请问:时间算法
- 用VAJ的来这里签个名吧,留个QQ,大家共同讨论……
b不能调用其父类A中的print()
没有必要这麽多废话吧,我替你说了吧:dickmi不会回答这个问题。
说实话,我也编了3年Java程序了,也算是Java程序员吧。最近,因需要用C++编个软件,猛啃了一阵C++,发现了这个问题,拿出来与大家探讨。究竟是不是像dickmi说的,这样做,根本没有必要???,具体需要这样做的地方,我暂时还真没有想到,想到再告诉大家。
对于java来说,在实际应用中应该不会需要这样的功能,而且我看过的java书籍中都没有提到这个。
首先大家应该知道
1。java所有的函数都是虚函数,(这个我可以肯定)
2。变量的声明仅仅是一个指针,变量的创建才会分配资源(希望我没记错:-P)
所以顶楼兄弟的例子就很好解释了:b指向了一个真实类型为B的实体;
a=b;语句的结果是:a,b指向了同一片内存。中间还有一次向上造型,是合法的。
当a.print()执行时,虚函数的特性,使得最终得到执行的,是由这片内存中实体的真正类型决定的,也就是B的print()会被运行,而不是A的print()被运行。
赞成这句话:
你爸是你爸,你是你,你能指望你控制你爸的嘴来填饱你的肚子
OOP嘛
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cherami终于说出了我的心声。
有没有必要,我也不知道,只是因为碰巧我遇到了这个问题,提出来,大家探讨一番。
import java.io.*;class A {
public A()
{
print();
}public void print() {
System.out.println("aaaaa");
}
};class B extends A {
public void print() {
System.out.println("bbbbb");
}
};public class test {
static void main(String args[])
{
B b = new B();
A a = new A();
a.print();
a = b;
a.print();
b.print();
}
}的結果為什么是如下呢﹖
bbbbb
aaaaa
aaaaa
bbbbb
bbbbb
爾不是﹕
aaaaa
aaaaa
aaaaa
bbbbb
bbbbb
public String name;
public void print() {
System.out.println("aaaaa");
}
}; class B extends A {
public void print(boolean VisualFlg) {
if( !VisualFlg)
super.print();
else
System.out.println("bbbbb");
}
public void print() {
System.out.println("bbbbb");
}
};
不行么?
怎么不能满足你的要求...
这个问题的应该可以用上面vampirelord的话解答。
B b = new B();
在调用构造函数时,内存已经存在两个print()。但是由于java所有的函数都是虚函数。所以自动调用B中的print()。
This should invoke A.print().
class A {
public String name;
public void print() {
System.out.println("aaaaa");
}
}; class B extends A {
public void print(){
if (this instanceof A)
{
super.print();
}
else {
System.out.println("bbbb");
}
} };
a.print();
b.print();
换成:
try { ((A) b.getClass().getSuperClass().newInstance()).print();} catch (IllegalAccessException iae) { iae.printStackTrace();} catch (InstantiationException ie) { ie.printStackTrace();}
这是sun的论坛上一位朋友给的代码。
你这样会把b的原来状态丢失,那还不如直接构造a。因为java也不支持多重继承,你编程时就已经可以确定它的父类了。这个问题没有什么实际的意义。
有些事是java做不到或避免做到的,大家何必要使劲在那想让java做它不能或不应该做的事呢?就好像有谁能在java里实现模版的功能?这是根本做不到的。
Class A ,Class B的构造器要在Class test构造器运作之前初始化!
B b=new B();
a=b;
a.print();如果print()是一个非静态方法,则这是一个典型的override/多态例
子,我想Java就是这么设计的,这时就是要调用B中的print(),
换句话说,这里就是专门留给多态的,你这样用表明你想在这
里用多态了 :-)想用多态,又不好好用高司令的胡子气的一撅一撅的
哈哈哈哈哈同样的代码,如果print)是静态方法,则a.print()会调用A中的print()。
(hide)
这个讨论也许该就此结束了。
应使用重载,而不是在子类的实现上做文章,
loose couple,easy to understand
因为只所以调用付类的method 是因为implement 不同,
调用者清楚的知道何时调用谁的方法