java继承使用的细节问题?
关于java继承的基本概念就不多说了,下面就说说继承使用应该注意的细节问题?
示例 一:
1 package com.bizvane; 2 3 class Fu{ 4 5 public Fu() { 6 System.out.println("Fu constructor ...."); 7 } 8 } 9 10 class Zi extends Fu{ 11 12 public Zi() { 13 System.out.println("Zi constructor ...."); 14 } 15 } 16 17 18 public class ExtendsDemo { 19 20 public static void main(String[] args) { 21 new Zi(); 22 } 23 }
执行结果:
Fu constructor ....
Zi constructor ....
看到这个结果,想必很多人会问,new Zi 类对象,并没有调用Fu 类呀,为什么会出现这个结果?
答案是: 在Zi类无参构造函数第一行会有一个隐式的 super() 语句, 这样就会初始化Fu类。
示例二:
1 package com.bizvane; 2 3 class Fu{ 4 5 public Fu(int x) { 6 System.out.println("Fu constructor ...."+x); 7 } 8 } 9 10 class Zi extends Fu{ 11 12 public Zi(int x) { 13 System.out.println("Zi constructor ...."+x); 14 } 15 } 16 17 18 public class ExtendsDemo { 19 20 public static void main(String[] args) { 21 new Zi(6); 22 } 23 24 }
执行结果:
在 第 13行编译报错,参数类型不匹配
大家肯定会想为什么呢?
答案是: 首先我们知道每个类中会有一个默认的无参构造函数,现在 Fu 和Zi 类都已经有了有参构造函数,那么默认的无参构造函数就不存在了,结合上面的例子,在Zi 类的有参构造函数第一行会有一个隐式的
super() 语句 当 new Zi(6); 的时候会初始化 Zi 类,super() 调用 Fu 类, 而此时 Fu 类 中已经没有无参构造函数,所以编译就通不过
正确解决办法: 在 Fu 类 加上一个 无参构造函数,或者在 Zi 类的有参构造函数前面加上一个显式 的 super(x)
示例三 :
1 class Fu{ 2 3 Fu(){ 4 System.out.println("Fu constructor ....A.."); 5 } 6 Fu(int x){ 7 System.out.println("Fu constructor ....B.."+x); 8 } 9 } 10 11 12 class Zi{ 13 14 Zi(){ 15 System.out.println("Zi constructor ....C.."); 16 } 17 Zi(int x){ 18 System.out.println("Zi constructor ....D.."+x); 19 } 20 } 21 22 class ExtendsDemo{ 23 24 public static void main(String[] args){ 25 new Zi(); 26 new Zi(6); 27 } 28 }
执行结果:
Fu constructor ....A..
Zi constructor ....C..
Fu constructor ....A..
Zi constructor ....D..6
你心里的答案是否这样的呢? 大家想想为什么吧?
思考: this()的用法?
1. 如果子类的构造函数第一行写了this调用了本类其他构造函数,那么super调用父类的语句还有吗?
没有的,因为this() 或者 super(), 只能定义在构造函数的第一行,因为初始化动作要先执行。
2. 父类构造函数中是否有隐式的super()语句呢?
也是有的,记住:只要是构造函数默认第一行都是有super()语句,
那么父类的父类是谁呢? super调用到底是谁的构造函数呢?
java体系在设计,定义了一个所有对象的父类 Object
总结:
类中的构造函数默认第一行都有隐式的super()语句,访问父类中的构造函数,
所以父类的构造函数既可以给自己的对象初始化,也可以给自己的子类对象初始化。
如果默认的隐式super的语句没有对应的构造函数,必须在构造函数中通过this 或者 super 的形式明确调用的构造函数。