黑马程序员技术交流社区

标题: super语句为什么放在子类构造函数第一行? [打印本页]

作者: 张洪慊    时间: 2013-1-21 16:09
标题: super语句为什么放在子类构造函数第一行?
本帖最后由 张向辉 于 2013-1-22 12:58 编辑

/*
如果你第一句不是super语句,
  可能出现  当你调用父类的某个非静态成员变量,
  那么父类还没有构造呢,你调用什么呢?
*/
class Person
{
  String name="ok";
}
class Student extends Person
{
Student()
{
  System.out.println(name);//从父类继承的name,说明在堆内存开辟了空间
}
}
class Extend_Construct
{
  public static void main(String[] args)
  {
        new Student();
  }
}
不知道理解是否有错误,或者有没有更好理解?
作者: 张洪慊    时间: 2013-1-21 16:25
....看视频不认真,刚又看一遍
毕老师讲的:
因为 如果先初始化自己,在找父类初始化,可能把自己的值覆盖掉.
作者: 贾文泽    时间: 2013-1-21 16:33
不是这样子的,java中规定,实例化子类对象调用子类构造函数进行初始化前,必须调用父类的构造函数对父类进行初始化。但是构造函数是不能继承的,所以只能在子类构造函数中用super();对父类初始化
如果说父类的构造函数中对父类的成员变量初始化,在子类构造函数中对继承父类的成员变量继续赋值,那super();不在第一行的话是不是又回到父类初始化状态了

作者: 卢浩    时间: 2013-1-21 16:37
应该就是你说的这个意思吧,super() 放在第一句应该是子类先先拿到父类里的“东西”初始化,这样后面才能用这些拿到的东西。
作者: 张洪慊    时间: 2013-1-21 16:38
IC-月辰 发表于 2013-1-21 16:33
不是这样子的,java中规定,实例化子类对象调用子类构造函数进行初始化前,必须调用父类的构造函数对父类进 ...

class Person
{
  String name;
  Person(String name)
  {
    this.name=name;

  }
}
class Student extends Person
{
Student(String name)
{
  super("lisi");
  this.name=name;
  //super("lisi")如果能成功的话,lisi覆盖掉zhansan得不到想要的zhangsan
  System.out.println(name);
  
}
}
class Extend_Construct
{
  public static void main(String[] args)
  {
        new Student("zhangsan");
  }

}
你看这个例子行不?
作者: vmvm555    时间: 2013-1-21 16:47
楼主可以这样想,没有父亲,怎么有儿子,你如果将super()语句放在其他语句后面,先对子类的一些属性进行初始化处理,这样就好像在没有父亲的情况下,突然出现了一个儿子,并为这个儿子设置姓名,户口等属性,这怎么说都说不过去吧
作者: 贾文泽    时间: 2013-1-21 16:55
张洪慊 发表于 2013-1-21 16:38
class Person
{
  String name;

额,这个lisi是赋值成功了,但是最后的结果还是zhangsan,,,super()不是在 最前面么,对父类先初始化,之后 执行 this.name=name 的时候,后面的name就是主函数中通过构造函数传进来的zhangsan。this.name 是当前对象的name。也就是子类对象的name,那在子类最后输出的name肯定是zhangsan啊

作者: 张洪慊    时间: 2013-1-21 16:57
IC-月辰 发表于 2013-1-21 16:55
额,这个lisi是赋值成功了,但是最后的结果还是zhangsan,,,super()不是在 最前面么,对父类先初始化 ...

欧了,这个例子自己写的 呵呵
作者: 张洪慊    时间: 2013-1-21 16:59
IC-月辰 发表于 2013-1-21 16:55
额,这个lisi是赋值成功了,但是最后的结果还是zhangsan,,,super()不是在 最前面么,对父类先初始化 ...

忘了 感谢了,谢了啊
作者: 贾文泽    时间: 2013-1-21 17:01
张洪慊 发表于 2013-1-21 16:59
忘了 感谢了,谢了啊

:o木事木事,同在论坛,只为学习
作者: 张洪慊    时间: 2013-1-21 17:03
IC-月辰 发表于 2013-1-21 17:01
木事木事,同在论坛,只为学习

滴水之恩 ,当涌泉相报~ 加油加油
作者: 高浩    时间: 2013-1-21 22:24
继承中之所会这样,是因为一个子类调用自己的构造函数,如果继承了父类,则需要靠父类的构造·函数来给自己初始化,使自己具备父类的东西。然后在在执行自己定义的构造函数,这样才实现了继承啊,继承不就是把父类的东西拿过来用吗?如果不调用父类构造函数,何来父类的东西,何来继承呢?
作者: 黄锦成    时间: 2013-1-22 11:50
你构造子类时,总会调用到父类的某个构造函数的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2