在构造方法时虚方法的调用出现错误!--为什么此时的school尚未赋值??

HzieeNO_1 2005-09-30 09:27:59
class ConstructInvokeMetamorph{
public static void main(String[] args){
Person s=new Person("Liming",18);
Student p=new Student("Liming",18,"beida");

}
}
class Person{
String name="noname";
int age=-1;
Person(String name,int age){
this.name=name;this.age=age;
sayHello();
}
void sayHello(){
System.out.println("I am a man,and my name is"+this.name+".My age is "+this.age);
}
}
class Student extends Person{
String school="noschool";
Student(String name,int age,String school){
super(name,age);
this.school=school;
}
void sayHello(){
System.out.println("I'm a student,and my name is"+this.name+".My age is "+this.age+
",and my school is "+this.school);
}
}
我预想的结果是:
I am a man,and my name is Liming.My age is 18.
I'm a student,and my name is Liming.My age is 18,and my school is beida
但是结果是:
I am a man,and my name is Liming.My age is 18.
I'm a student,and my name is Liming.My age is 18,and my school is null
程序中哪里出现了错误?好像是方法的调用时,school尚未赋值,请问这是怎么回事?它怎样才能赋值,这个程序的执行过程是怎么样?请高手不吝赐教!!
...全文
96 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
laou2008 2005-10-01
  • 打赏
  • 举报
回复
纠正一下:在这里来个sayHello()有什么意思吗?在这里应该调用完父类的sayHello()方法,就接着调用子类的sayHello(){,当然现在还没有给school初始化.
laou2008 2005-10-01
  • 打赏
  • 举报
回复
class ConstructInvokeMetamorph{
public static void main(String[] args){
Person s=new Person("Liming",18);
Student p=new Student("Liming",18,"beida");

s.sayHello(); //拿各自的句柄调用自己的方法
p.sayHello();

}
}
class Person{
String name="noname";
int age=-1;
Person(String name,int age){
this.name=name;this.age=age;
//sayHello(); 在这里来个sayHello()有什么意思吗?在这里应该调用完父类的构造方法,就接着调用子类的,当然现在还没有给school初始化.
}
void sayHello(){
System.out.println("I am a man,and my name is"+this.name+".My age is "+this.age);
}
}
class Student extends Person{
String school="noschool";
Student(String name,int age,String school){
super(name,age);
this.school=school;
//sayhello() 这里如果也来个,你看看结果就会明白了
}
void sayHello(){
System.out.println("I'm a student,and my name is"+this.name+".My age is "+this.age+
",and my school is "+this.school);
}
}
HzieeNO_1 2005-09-30
  • 打赏
  • 举报
回复
fangxifa() ,你改动了什么?我好像没感觉有解决这个问题啊!还是null啊!
HzieeNO_1 2005-09-30
  • 打赏
  • 举报
回复
Super tmp = new Sub(); tmp.method()调用子类的method,这里就是动态绑定了,
以前我没注意这种形式,谢谢楼上,我好好琢磨一下!
fangxifa 2005-09-30
  • 打赏
  • 举报
回复
我重新调了一下,出的问题道理如believefym(feng) 所说,在调用sayhello时,school还没有构造成功。我的改动如下,
class ConstructInvokeMetamorph{
public static void main(String[] args){
Person s=new Person("Liming",18);
Student p=new Student("Liming",18,"beida");

}
}
class Person{
String name="noname";
int age=-1;
Person(String name,int age){
this.name=name;this.age=age;
sayHello();
}
void sayHello(){
System.out.println("I am a man,and my name is"+this.name+".My age is

"+this.age);
}
}
class Student extends Person{
String school="noschool";
Student(String name,int age,String school){
//this.school=school;
super(name,age);
this.school=school;
System.out.println("and my school is "+school);
}

}
believefym 2005-09-30
  • 打赏
  • 举报
回复
你可以在两个构造函数和两个sayhello方法里各自输出一些信息,看输出结果判断程序执行的顺序
关于动态绑定
class Super{public void method(){}}
class Sub extends Super{public void method()}//这里的method就是override

Super tmp = new Super();tmp.method()调用父类的method
Super tmp = new Sub(); tmp.method()调用子类的method,这里就是动态绑定了,

再详细我也讲不清了,自己领会了就明白了,多看书和例子好了
HzieeNO_1 2005-09-30
  • 打赏
  • 举报
回复
各程序字段输出调试,请楼上指教一下,怎么输出?
动态绑定我虽然反复读书上的解释,但是我还是对动态绑定理解不了?也请指教
believefym 2005-09-30
  • 打赏
  • 举报
回复
因为student调用构造函数的时候先调用父类的构造函数,父类的构造函数调用sayhello方法,此时动态绑定,student的对象调用student的sayhello方法,而此时student的构造函数尚未调用,school尚未初始化,所以为full

楼主不妨在各程序段内输出调试,看看程序的运行顺序就明白了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧