版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_36161077/article/details/81168936
学会了Python中的继承机制,在会过来看看java中的继承机制,你会感觉到原来Python是多么简单的一门语言,不用纠结于那么多的声明与定义。这里简单说一下java继承机制中需要注意的一些点。直接上代码吧!!!
在构造方法的继承中,我们可以选择子类继承负类的构造方法,也可以选择不继承父类的构造方法。
先看一下下面的代码,以下的代码是子类选择不继承父类的构造方法的。
class Fu { ### 父类
public Fu() {
System.out.println("Fu()");
} // 定义了一个无参的构造方法
public Fu(String name) {
System.out.println("hello");
} // 定义了一个有参的构造方法
}
// 使用extends来继承父类Fu
class Zi extends Fu {
public Zi() {
System.out.println("zi()");
} // 定义了一个无参的构造方法,但是不继承父类的无参构造方法
public Zi(String name) {
System.out.println("world");
} // 定义了有参的构造方法,但是不继承父类的有参构造方法
}
class ExtendsDemo4 {
public static void main(String[] args) {
//创建子类对象
Zi z = new Zi(); // 并调用无参的构造方法
System.out.println("-------------");
Zi z2 = new Zi("java"); // 创建子类对象并调用有参的构造方法
}
}
结果:
Fu()
zi()
-------------
Fu()
world
简单解释一下这个代码,首先主程序都是从 public static void main 开始的,进入main后,执行的是 Zi z = new Zi();
,这里创建了一个子类对象,这个子类是继承父类 Fu的,在 Zi类中有两个构造方法,分别为有参的构造方法和无参的构造方法,而Zi z = new Zi();
调用的是无参的构造方法,进入Zi类的public Zi(),我们注意到,第一个打印的是“Fu”,说明子类的无参构造方法继承了父类的无参构造方法,然后打印 “zi()”,然后下面创建子类对象并调用有参的构造方法Zi z2 = new Zi("java");
中又打印了一次“Fu”,这也就证明了子类中所有的构造方法默认都会访问父类中空参数的构造方法。 为什么呢?因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。 然后执行了子类中有参构造方法的语句,打印“world”。
可以。通过super(…),无参子类 访问父类的无参构造方法使用super(),有参子类 访问父类的有参构造方法使用super(参数),
请看:
class Zi extends Fu {
public Zi() {
super();
System.out.println("zi()");
} // 定义了一个无参的构造方法,但是不继承父类的无参构造方法
public Zi(String name) {
super("aaa");
System.out.println("world");
} // 定义了有参的构造方法,但是不继承父类的有参构造方法
}
我们在子类中加入了两个super(),位置分别在有参构造方法和无参构造方法中,其实无参的构造方法中的super()是可以省略的。而在有参的构造方法中加入了super(参数),则调用了父类中的有参构造方法。所以打印的结果如下
Fu()
zi()
-------------
hello
world
最后总结一下注意事项:
A:每一个构造方法的第一条语句默认都是:super()
B:super(...)这样的形式在构造方法中只能出现一次。
C:如果父类没有无参构造方法,那么,我们只能
a:通过super去访问父类的带参构造方法。
b:通过this去访问本类的其他构造方法。