在上节课中我们知道类的继承是存在局限性的,一个子类只能继承一个父类。
但是可以多重继承,多重继承就是先让B类继承A类,之后再让C类继承B类。
class A{} //这是父类
class B extends A{}; //此时B类具备了A的操作
class C extends B{}; //此时C类有A类和B类的所有操作
多重继承
public class A {
String nameString="张三";
}
public class B extends A{
Integer ageInteger=20;
}
public class C extends B{
}
public class Hello {
public static void main(String[] args) {
//实例化一个C类对象
C c =new C();
System.out.println("名字是:"+c.nameString+",年龄是:"+c.ageInteger);
}
}
此时C类就继承了A类和B类的属性以及方法,其实上在实例化子类的时候会调父亲的构造方法(虽然子类不能继承父类的构造方法,但是在实例化子类的时候会默认调用),而且默认调用的是无参构造方法。
调用父亲的构造方法
public class A {
String nameString="张三";
//增加一个有参构造方法
public A(String name) {
this.nameString=name;
}
}
Implicit super constructor A() is undefined for default constructor. Must define an explicit constructor
在A类中加入有参构造方法,通过上面的错误提示可以知道实例化子类的时候一定要先调用父类的构造方法,默认调用的是无参构造方法,此时如果提供了有参构造方法,那么我们要将无参构造方法显示地定义。
public class A {
String nameString="张三";
//增加一个有参构造方法
public A(String name) {
this.nameString=name;
}
//定义无参数构造方法
public A() {
System.out.println("我是A类的无参构造方法");
}
}
我是A类的无参构造方法
名字是:张三,年龄是:20
知道了实例化子类的时候要调用父类的无参构造方法,如果要调用有参构造方法呢?此时需要使用到一个新的关键字【super】
在B中加入无参构造方法
public class B extends A{
Integer ageInteger=20;
public B() {
System.out.println("我是B类的无参构造方法");
}
}
我是A类的无参构造方法
我是B类的无参构造方法
名字是:张三,年龄是:20
B中若无显示的无参构造方法,他会使用系统中默认的
先调用A类再调用B类
调用有参构造方法【super】
public class B extends A{
Integer ageInteger=20;
public B() {
super("王五");//调用了A类有参构造方法
System.out.println("我是B类的无参构造方法");
}
}
我是B类的无参构造方法
名字是:王五,年龄是:20
调用了A类的有参构造方法之后,不会调用A类的无参构造方法,因为super已经明确指定了调用A类的有参构造。
总结:
1.继承有单继承的局限(一个子类只能有一个父类),但是可以多重继承。
2.在实例化子类的时候会先调用父类的构造方法(默认调用的是无参构造方法,如果要调用有参构造需要使用关键字super实现)
3.如果是多重继承,那么实例化子类的时候最先调用的是最高父类的构造方法,依次往下。