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();可有可无呢? 展开
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();可有可无呢? 展开
4个回答
展开全部
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++编译环境,把程序的汇编代码掉出来,跟踪程序在内存中的每一步执行情况。这样应该会有很大帮助。
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++编译环境,把程序的汇编代码掉出来,跟踪程序在内存中的每一步执行情况。这样应该会有很大帮助。
展开全部
(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
结果不会改变
所以你 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
结果不会改变
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
问题一:
程序二里的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();它也会自动调用父类的构造方法的
程序二里的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();它也会自动调用父类的构造方法的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
问题一:
java里的new是创建一个等号左边类型的实例
C c = new D();
就是创建了一个C类型的实例,因为D类继承了C类,所以也属于C的类型
反过来
D c = new C();就不对了
因为C类不属于D类,所以会报错,类型不匹配
问题二、三:
在构造器中,如果该类继承了其他类,会先调用父类的构造方法,所以程序一中的super()方法可以省略不写,java虚拟机会自动调用父类方法,这也解释了为什么程序一会打印Calling Father :x=3
java里的new是创建一个等号左边类型的实例
C c = new D();
就是创建了一个C类型的实例,因为D类继承了C类,所以也属于C的类型
反过来
D c = new C();就不对了
因为C类不属于D类,所以会报错,类型不匹配
问题二、三:
在构造器中,如果该类继承了其他类,会先调用父类的构造方法,所以程序一中的super()方法可以省略不写,java虚拟机会自动调用父类方法,这也解释了为什么程序一会打印Calling Father :x=3
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询