继承中构造方法的注意事项
- A:案例演示
- 父类没有无参构造方法,子类怎么办?
- super解决
- this解决
- B:注意事项
- super(…)或者this(….)必须出现在构造方法的第一条语句上
- 两者不可以同时出现在构造方法内,因为都是初始化的作用
- super()访问父类的方法,this()访问本类的方法
代码如下
public class Demo2_Extends {
public static void main(String[] args) {
Son s1 = new Son (); //1 先执行son空参构造
System.out.println (s1.getName () + "..." + s1.getAge ()); //5 输出李四...24
System.out.println ("..................");
Son s2 = new Son ("张三",23); //1.son有参构造
System.out.println (s2.getName () + "..." + s2.getAge ()); //5.输出张三...23
}
}
class father1 {
private String name; //姓名
private int age; //年龄
/* public father1() { //空参构造 注释掉结果一样
System.out.println ("father空参构造");
}*/
public father1(String name , int age) { //有参构造
this.name = name;
this.age = age;
System.out.println ("father有参构造");//3 输出 3.输出
}
public void setName(String name) { //设置姓名
this.name = name;
}
public String getName() { //获取姓名
return name;
}
public void setAge(int age) { //设置年龄
this.age = age;
}
public int getAge() { //获取年龄
return age;
}
}
class Son extends father1{
public Son(){ //空参构造
//super();隐藏起来了
//super("李四",24); //2 执行父类有参构造
this("王五",25);
System.out.println ("Son 空参构造"); //4 输出son空参构造
}
public Son(String name,int age){ //有参构造
//super();隐藏起来了
super(name,age); //2.执行父类有参构造
System.out.println ("Son 有参构造"); //有参构造 4.输出输出son有参构造
}
}
结果
father有参构造
Son 有参构造
Son 空参构造
王五...25 (this解决的时候) //李四,24(super解决的时候)
..................
father有参构造
Son 有参构造
张三...23
注:
- 数字加空格是分割线上部分的执行顺序 ,数字加点是分割线下部分的执行顺序。
- 父类空参构造注释了之后,构造方法系统默认给的,写了就不给,此时有参构造方法还在,系统就不给了,此时super()调用的是父类的空参构造,而空参构造没有,编译则失败。
如果将父类的有参构造也注释掉,则编译通过,但这样不好,父类只有一个有参构造,结果注释了,修改了类,实际上别人给的可能是字节码文件,只可以修改自己的类。这个时候就应该在子类中用super(name,age)访问父类的有参。 - super(“李四”,24)通常不这样写,因为写死了变量,通常是super(name,age)。