日期:2014-05-20  浏览次数:20636 次

java继承中的构造方法问题
class Person{
  private String name;
  /*Person(){
  System.out.println("调用了Person缺省构造函数");
  }*/
  Person(String name){
  this.name=name;
  System.out.println("调用了Person带参构造函数");
  }
}
class Student extends Person{
  private String school;
  Student(){
  super("lisi");
  System.out.println("调用了Student缺省构造函数");
  }
  Student(String school){
  // super("lisi");
  this.school=school;
  System.out.println("调用了Student带参构造函数");
  }
}
public class TestPerson{
  public static void main(String[] args){
  Student s1=new Student();
  }
}
如上代码编译会通不过,但是将super("lisi")的注释去掉就能通过,求解释。。。

------解决方案--------------------
super是用在和父方法名字一样的情况的,知否啊。你那个 super("lisi") 等于调用了Person类的Student(String s) 的方法,问题是这个方法不存在

你可以吧super("lisi") 改成 Person("lisi"); 或者给给person做个setName的方法。
------解决方案--------------------
学习了
------解决方案--------------------
LZ其实是对的啦,这边的super是调用的父类的构造方法的,而且LZ注释掉的super方法不能注释的呀,必须得写的,不然父类就不能初始化了,我试了一下,加上super是对的,去掉就错了哇~~~
------解决方案--------------------
探讨

super("lisi")不是调用Person类的带参构造方法吗

------解决方案--------------------
探讨

引用:
LZ其实是对的啦,这边的super是调用的父类的构造方法的,而且LZ注释掉的super方法不能注释的呀,必须得写的,不然父类就不能初始化了,我试了一下,加上super是对的,去掉就错了哇~~~

父类不是有两个构造方法吗,可以用那个带参的初始化啊,Student(){
super("lisi");
System.out.p……

------解决方案--------------------
探讨

引用:
引用:

引用:
LZ其实是对的啦,这边的super是调用的父类的构造方法的,而且LZ注释掉的super方法不能注释的呀,必须得写的,不然父类就不能初始化了,我试了一下,加上super是对的,去掉就错了哇~~~

父类不是有两个构造方法吗,可……

------解决方案--------------------
给super("lisi")加上//时,说明你没显式调用父类的构造器,那么系统就会隐式调用不带参数的父类构造器,但是你又/*Person(){
System.out.println("调用了Person缺省构造函数");
}*/给注释啦。所以系统就调用带参数的,但你又没给人家参数,人家当然就不干啦