一. 子类继承父类的调用关系顺序
在java中没有多重继承
也就是说 一个子类只能继承一个父类,不能类C同时继承类A和类B
调用关系同等与C++,继承关键字extends
class text1
{
int X, Y;
public text1()
{
X = 0;
Y = 0;
System.out.println("无参text1");
}
public text1(int x, int y)
{
X = x;
Y = y;
System.out.println("有参text1");
}
public String toString()
{
return (this.X + " " + this.Y);
}
}
class text2 extends text1
{
int Z ;
public text2()
{
int Z = 0; /// 利用2 调用 1 的xy
System.out.println("无参text2");
}
public text2(int z)
{
Z = z;
System.out.println("有参text2");
}
}
public class text
{
public static void main(String args[])
{
text2 t2 = new text2();
}
}
在text类中,我们创建一个text2,继承text1, 先调用text1的构造函数,再调用text2的构造函数
二.继承成员
在上面的例子中,text2只写了一个Z
如果我们给text1的X,Y赋值,再用text2的对象调用X,Y
public class text
{
public static void main(String args[])
{
text1 t1 = new text1(1, 2);
text2 t2 = new text2();
System.out.println(t2.X + " " + t2.Y );
}
}
可以看到 t1 调用了有参的构造函数
其次通过 t2 调用的X,Y都是 t2 自己继承 text1 的无参构造函数里面的X,Y
并不是 t1 赋值后的X,Y
所以t2并不能继承t1的x,y,只是有了text1中的成员属性x,y
三.调用父类的构造函数及子类调用父类的构造函数
我们现在补全text2的构造函数
public text2()
{
int X = 0;
int Y = 0;
int Z = 0;
System.out.println("无参text2");
}
public text2(int x, int y, int z)
{
X = x;
Y = y;
Z = z;
System.out.println("有参text2");
}
改写主函数
public class text
{
public static void main(String args[])
{
text2 t2 = new text2(2, 3, 4);
System.out.println(t2.toString());
}
}
我们又能发现,不管 t2 是有参还是无参,都会调用 text1 的无参构造函数
**使用 t2 调用 toString 函数时,打印的X,Y也是给 t2 赋值的x,y **
四. 默认构造函数 及 父类无参构造函数的重要性
主函数
public class text
{
public static void main(String args[])
{
text2 t2 = new text2(2, 3, 4);
}
}
1. 删除父类无参构造函数
会报错
2. 删除父类有参的构造函数
会正常运行
3.都删除
只调用text2的有参
这说明java中如果你构造函数一个都没写,系统会有默认的函数,只调用子类自身的构造函数
但是只写了一个有参的构造函数,系统会报错
如果只写了一个无参的构造函数,没有有参的,也能运行
所以以后把无参构造函数都写上