JAVA初级问题

程序一:classFather{intx;Father(){x=3;System.out.println("CallingFather:x="+x);}voiddoSom... 程序一:
class Father{
int x;
Father(){
x=3;
System.out.println("Calling Father :x="+x);
}
void doSomething(){
System.out.println("Calling Father.doSomething()");
}
}
class Son extends Father{
int x;
Son(){
super();
x=5;
System.out.println("Calling Son : x="+x);
}
void doSomething(){
super.doSomething();
System.out.println("Calling Son.doSomething()");
System.out.println("Father.x="+super.x+"Son.x="+x);
}
}
public class SuperDemo {
public static void main(String[] args) {
Son son=new Son();
son.doSomething();
}
}
打印结果:
Calling Father :x=3
Calling Son : x=5
Calling Father.doSomething()
Calling Son.doSomething()
Father.x=3Son.x=5

程序二:
class C{
void abc(){
System.out.println("Calling C's method abc");
}
}
class D extends C{
void abc(){
System.out.println("Calling D's method abc");
}
}
public class Dispatch {
public static void main(String[] args) {
C c=new D();
c.abc();
}
}
打印结果:
Calling D's method abc

问题一:
程序二里的C c=new D();是什么意思?为什么不能写成D c=new C();?

问题二:
接问题一,C c=new D();书上写父类对象c引用的是子类的实例,所以Java运行时调用子类D的abc,那为什么程序一里的打印结果还会出现Calling Father :x=3呢?好像没有调用到父类啊!

问题三:
为什么程序一里的super();可有可无呢?
展开
 我来答
17哥
2008-06-09 · 菩提只向心觅,何劳向外求玄
17哥
采纳数:244 获赞数:1230

向TA提问 私信TA
展开全部
1:C c = new D(),就把派生类的对象的引用赋值给他的基类的对象。这应用了面向对象编程的多态。而D c = new C();则是不对的。就好像你的长辈可以合理的过问你的事,而你过问长辈的事,一般是视为没有礼貌的一样。
2:因为在 Class Son中的构造函数和行为doSomething()中,都用了super()行为从而调用了父类的构造函数和行为。当Son son = new Son();时先调用构造函数son(),但是son()中的第一句是super();因此调用了父类的构造函数,所以先输出”Calling Father :x=3 “,然后再输出基类的Calling Son : x=5 ;son.doSomething()的执行过程也是如此,所以才会出现你的输出。
3:关于super(),他是用在基类中调用父类的方法的。所以是可有可无的。
建议:如果想深入了解派生与多态,可以用VC++编译环境,把程序的汇编代码掉出来,跟踪程序在内存中的每一步执行情况。这样应该会有很大帮助。
suminglan
2008-06-09 · TA获得超过200个赞
知道答主
回答量:87
采纳率:0%
帮助的人:0
展开全部
(1)C是父类,D是C的子类。

所以你 C c=new D()是没有问题的。
其实就相当于D d=new D(), 然后C c=d。

但是如果D c=new C()就有问题了。
这就相当于C d=new C(),然后 D c = d。

==做个比喻==
C是动物类,D是兔子类。
你说兔子是动物当然对,但如果你说动物是兔子就有问题了。

(2)调用了super()了。构造方法了调用了。
Son(){
super();
~~~~~~~~~就是这个
x=5;
System.out.println("Calling Son : x="+x);
}
调用了Father类里的构造方法
Father(){
x=3;
System.out.println("Calling Father :x="+x);
}

所有,他先执行那个了super()语句,给x赋值3,打印Calling Father :x=3。
然后,继续作给x赋值5,打印Calling Son : x=5 。

(3)因为子类构造方法会自动调用父类构造方法。
即时Son类的构造方法里没有super()这句。
Son(){
super();
~~~~~~~~~就是这个
x=5;
System.out.println("Calling Son : x="+x);
}
他一样可以打印出:
Calling Father :x=3
Calling Son : x=5
Calling Father.doSomething()
Calling Son.doSomething()
Father.x=3Son.x=5

结果不会改变
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tsorgy
2008-06-09 · TA获得超过979个赞
知道小有建树答主
回答量:356
采纳率:0%
帮助的人:558万
展开全部
问题一:
程序二里的C c=new D();是什么意思?为什么不能写成D c=new C();?
因为子类可以转换为父类,父类无法转换成子类(可以这样写:Object o=(Object)"abc";,但不能这样写:Flaot f=(Float)o;(设o是个Object对象))

问题二:
接问题一,C c=new D();书上写父类对象c引用的是子类的实例,所以Java运行时调用子类D的abc,那为什么程序一里的打印结果还会出现Calling Father :x=3呢?好像没有调用到父类啊!
那是因为创建子类的时候是先调用父类的构造函数,然后执行子类的构造函数,所以运行了这两句:
x=3;
System.out.println("Calling Father :x="+x);

问题三:
为什么程序一里的super();可有可无呢?
因为你不在子类的构造方法里写super();它也会自动调用父类的构造方法的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友4953e90
2008-06-09 · 超过13用户采纳过TA的回答
知道答主
回答量:91
采纳率:0%
帮助的人:55.6万
展开全部
问题一:
java里的new是创建一个等号左边类型的实例
C c = new D();
就是创建了一个C类型的实例,因为D类继承了C类,所以也属于C的类型
反过来
D c = new C();就不对了
因为C类不属于D类,所以会报错,类型不匹配
问题二、三:
在构造器中,如果该类继承了其他类,会先调用父类的构造方法,所以程序一中的super()方法可以省略不写,java虚拟机会自动调用父类方法,这也解释了为什么程序一会打印Calling Father :x=3
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式