继承是java和所有的oop(面向对象)语言不可缺少的组成部分。我们在创建一个类的时候,除非明确的使用extend关键字指出继承那个类,否则都会去继承Object类,也可以说Object类是所以类的父类。而继承类(子类)则会得到基类(父类)中的所有方法和域<br />**继承的特性**:
子类拥有父类非 private 的属性、方法。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。(重写)
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)
继承中的初始化:
Java中会自动在导出类的构造器中插入基类(父类)构造器的调用
class Art{
Art(){
System.out.println("Art类的无参构造器");
}
}
class Drawing extends Art{
Drawing(){
System.out.println("Drawing类的无参构造器");
}
}
public class Cartoon extends Drawing{
Cartoon(){
System.out.println("Cartoon类的无参构造器");
}
public static void main(String[] args) {
Cartoon cartoon = new Cartoon();
}
}
Output
Art类的无参构造器
Drawing类的无参构造器
Cartoon类的无参构造器
我们可以发现,Java中会自动在导出类(new 出的类)的构造器中插入基类(父类)构造器的调用,且当多个类继承时,会先执行最顶级的基类的构造器。
上面的代码中类的构造器是无惨的,如果是有参的呢?
我们修改上面的代码,在每个类的构造器中都加入参数
class Art{
Art(String str){
System.out.println(str+"类的无参构造器");
}
}
class Drawing extends Art{
Drawing(String str){
super("Art");//如果没有super()则此类的有参构造方法会报错
System.out.println(str+"类的无参构造器");
}
}
public class Cartoon extends Drawing{
Cartoon(String str){
super("Drawing");//如果没有super()则此类的有参构造方法会报错
System.out.println(str+"类的无参构造器");
}
public static void main(String[] args) {
Cartoon cartoon = new Cartoon("Cartoon");
}
}
我们发现,在Drawing和Cartoon类中的有参构造方法里面多啦一行suppe()这样的代码。所以当基类和子类的为有参构造器时,我们必须得在子类中显示的去调用父类得构造器,否则报错;如果基类中有无参构造器,子类可以不用显示的调用基类的构造器。