程序结果与我预想的不一样.....请教

sure2003 2008-07-03 02:29:46
package shuren.ren;
//class Teacher
class Teacher
{
public Teacher()
{
System.out.println("父类无参构造");
}
public Teacher (String str)
{
System.out.println(str);
}
}
//class Student
class Student extends Teacher
{
public Student()
{
System.out.println("子类无参构造");
}
public Student (String str) //这里是调用的口子,但为什么去调用父类型.要调用也
{ //应该调用父类的有参构造才对!!
System.out.println(str);
}
}
//主class
class Srmethod
{
public static void main(String args[])
{
Student objs2=new Student("子类带一个参数的构造方法");
}
}


结果:
--------------------Configuration: dd - JDK version 1.6.0 <Default> - <Default>--------------------
父类无参构造
子类带一个参数的构造方法

Process completed.

...全文
246 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lnfszl 2008-07-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 AWUSOFT 的回复:]
在调用子类构造函数的时候,如果第一句不是构造函数调用(构造函数里还可以调用其它的构造函数).那么在执行里边的代码之前要先调用父类无参构造函数.除非就是显示的调用父类哪个构造函数.
[/Quote]


agree
king_spf 2008-07-03
  • 打赏
  • 举报
回复
在子类实例化的时候,先要调用父类的构造方法。如果不在子类构造方法的第一行显式调用的话系统将自动调用父类无参构造方法。所以结果是正确的。
KOOK_OKKO 2008-07-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 sure2003 的帖子:]
public Student (String str) //这里是调用的口子,但为什么去调用父类型.要调用也
{ //应该调用父类的有参构造才对!!
System.out.println(str);
}

[/Quote]
默认调用父类无参构造函数,除非你显示调用super(XX)
sure2003 2008-07-03
  • 打赏
  • 举报
回复
还不是很明白
chenshouyu 2008-07-03
  • 打赏
  • 举报
回复
写了一下代码,明白了,谢谢
chenshouyu 2008-07-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chief_fu 的回复:]
补充:

若子类显式调用父类构造方法时:父类可以没有无参构造方法。
[/Quote]


可以举个例子吗?
sagezk 2008-07-03
  • 打赏
  • 举报
回复
    public Student (String str)  //这里是调用的口子,但为什么去调用父类型.要调用也
{ //应该调用父类的有参构造才对!!
System.out.println(str);
}

子类中无论用哪个构造方法初始化对象其父类构造方法都要被调用到,否则父类定义的私有实例域就没法初始化了,所以你的构造方法中第一句如果既没写 this()(通过本类其它构造方法间接调用父类构造方法)又没写 super()(自己直接调用父类构造方法),那么在编译时编译器会帮你加上一句 super(); 到你构造方法的第一行。
chief_fu 2008-07-03
  • 打赏
  • 举报
回复
补充:

若子类显式调用父类构造方法时:父类可以没有无参构造方法。
chief_fu 2008-07-03
  • 打赏
  • 举报
回复
类的初始化过程:
1、分配空间;
2、初始化变量;
3、递归调用父类的无参构造方法;
4、掉用本类的构造方法;

如果你明白了这个过程,你就会明白:为什么输出是那个样子了。

补充:
类B要继承一个类A,则类A必须有一个无参构造函数。
java虚拟机会为未定义构造函数的类提供一个默认的无参构造函数;
但是,如果你为某个类C写了任何一个构造函数(有参或无参),java虚拟机就不会为类C提供默认构造函数了。因此,如果你的类A写了个有参构造函数,又想写一个类B继承类A,那么,你必须为类A再添加一个无参构造函数。

若想调父类的有参构造方法,需要在构造函数里第一行显式调用super(参数列表...);
awusoft 2008-07-03
  • 打赏
  • 举报
回复
下边的代码是错的.

package shuren.ren;
//class Teacher
class Teacher
{
public Teacher (String str)
{
System.out.println(str);
}
}
//class Student
class Student extends Teacher
{
public Student()
{
System.out.println("子类无参构造");
}
public Student (String str) //这里是调用的口子,但为什么去调用父类型.要调用也
{ //应该调用父类的有参构造才对!!
System.out.println(str);
}
}
//主class
class Srmethod
{
public static void main(String args[])
{
Student objs2=new Student("子类带一个参数的构造方法");
}
}
awusoft 2008-07-03
  • 打赏
  • 举报
回复
在调用子类构造函数的时候,如果第一句不是构造函数调用(构造函数里还可以调用其它的构造函数).那么在执行里边的代码之前要先调用父类无参构造函数.除非就是显示的调用父类哪个构造函数.
qinjinxtu 2008-07-03
  • 打赏
  • 举报
回复
子类构造方法如没有显示调用父类构造方法super(参数),则自动调用无参数的构造方法。。。
如果父类没有无参数的构造方法,则会提示错误。。
在你没写构造方法的类里,系统自动提供无参数的构造方法。。。。
sure2003 2008-07-03
  • 打赏
  • 举报
回复
那为什么会去调用无参的
调用时,好象长了眼睛一样
:)
joynet007 2008-07-03
  • 打赏
  • 举报
回复
结果:
--------------------Configuration: dd - JDK version 1.6.0 <Default> - <Default>--------------------
父类无参构造
子类带一个参数的构造方法

Process completed.

这个结果应该是对的哦!!

因为,Teacher类的构造方法!有两个构造方法,但是你的student 类没有 显示调用,所以就要调用 Teacher()的构造方法,而不是掉用 Teacher(String str) 的构造方法哦,但是 main 函数里面 的就是 显示 的调用了
Students 里面的 Student (String str) 的方法,所以要输出 子类带一个参数的构造方法 但是 要先输出父类的方法东西,才能输出子类的!!

个人想法,。。。
sunzhyng 2008-07-03
  • 打赏
  • 举报
回复
继承的类,创建时先执行父类的构造函数

62,635

社区成员

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

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