子父类中的构造函数一天学下来,很多同学在自己写代码的时候都觉得晕乎乎的
出现的编译失败也是千奇百怪,改起来都头晕。
所以我在这里提出一些自己总结的观点,未必正确还请个位指正。
下面就以一段简单的代码 以及两个输出语句
演示子父类中构造函数的加载顺序
/*
子类调用父类有参构造方法
子类中的所有!! 构造方法都会!!访问父类中的无参构造方法
*/
class Fu
{
String name;
int age;
public Fu () {
System.out.println("正在调用父类无参构造");
}
public Fu (String name, int age)
{
this.name = name;
this.age = age;
System.out.println("正在调用父类有参构造方法");
}
//定义一个show方法用来虚区name和age的值
//该方法可以被子类继承
public void show()
{
System.out.println("name"+name+"---"+"age"+age);
}
}
class Zi extends Fu
{
//首先定义子类的无参构造
public Zi () {
System.out.println("正在调用子类无参构造");
}
//如果想在子类构造方法中 调用父类构造方法有参 首先 需要做的是定义子类有参构造
//然后在其中调用带参数值的父类构造方法
public Zi (String name,int age)
{
super("汪汪",5);
//super.name = name;
//super.age = age;
System.out.println("正在调用子类带参构造");
}
}
//主方法所在
class ExtendsDemo
{
public static void main(String[] args)
{
//new一个子类对象用来测试在子类中调用父类无参构造
Zi z = new Zi();
z.show();
//new一个子类对象用来测试在子类中调用父类带参构造
Zi z2 = new Zi("喵喵",2);
z2.show();
}
}
‘
上面这段代码可以在代码运行到加载子类父类的构造函数时打印出相应的 正在调用
运行以后可以帮助对调用的过程加深一些理解
这里要说几种常见的错误
1.子类构造函数运行的时候一定会先访问父类的默认无参构造方法
如果在父类中 只定义带参构造 而不写无参构造 即省略掉public Fu () {}
这时如果子类中有无参构造 就会出现编译错误 因为父类中定义了带参构造以后
默认的无参就没了,这时子类再去访问父类的时候就会出现构造方法的参数列表不匹配
解决办法就是在父类中最好每次都写上无参构造
2.在子类构造方法中调用父类的构造方法
public Zi (String name,int age){
super("汪汪",5);
}
这里也比较容易出错,
首先单说定义,在子类构造函数中调用父类构造函数,所以要把父类的构造函数调用格式写在子类的大括号内
用super调用了父类有参构造方法以后里面写什么,
其实写的是父类带参构造方法的参数列表所对应的局部变量
如果写成super(String name,int age)是不正确的
3.在最后new出来的z2对象中 我明明赋值是喵喵 2 为什么运行的结果是汪汪 5
因为在这种写法中调用父类带参构造方法的时候已经对父类中的成员变量进行了赋值
show方法打印的是父类中的name值和age值
以上几个地方的说明希望对大家有所帮助 |
|