继承

一、定义

image-20221016144937017

二、基本使用

1
2
3
4
class className extend furtherClassName){


}

三、继承的使用细节

  1. 子类继承了所有的属性和方法,非私有的属性和方法可以直接在子类中进行访问,但是私有属性和方法不能在子类直接访问,要通过==父类提供==的公共方法去访问。

  2. 子类必须调用父类的构造器,完成父类的初始化

    1. 在子类的构造器中会有 super

  3. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器。如果父类没有提供无参构造器,则必须在子类的构造器中使用super去指定使用父类的哪个构造器完成对父类

    如果父类中没有构造器,那编译器会自动添加一个空的同名构造器,如果父类中有其他构造器,则编译器不会创建空形参的同名构造器。

    则下面这段代码就会报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class base {
public String n1="hello";
protected String n2;
String n3="n3";
private String n4="n4";
base(String name){

}
//缺少无参构造器的显式创建
}
//子类
public class sub extends base{
public sub(){
System.out.println(n1+n2+n3+getn4());
}

}
//另一个类进行调用

public class demo {
public static void main(String[] args) {
new sub();
}
}

//结果


java: 无法将类 com.jhfuture.extend.base中的构造器 base应用到给定类型; 需要: java.lang.String 找到: 没有参数 原因: 实际参数列表和形式参数列表长度不同

  1. 如果需要指定使用父类的构造器,在子类构造器中使用super()

    1. 调用无参构造器 —–> super() /什么都不写
    2. 调用有参构造器 ——> super( parameter)
  2. super在使用时,需要放在==构造器的第一行==(且super只能在构造器中使用)

  3. super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器

  4. Java所有类都是object类的子类,object是所有类的基类。

    1. image-20221016160315556
  5. 父类构造器的调用不限于直接父类!将一直往上追溯到object类(顶级父类)

  6. 子类最多只能继承一个父类(指直接继承),即java中是==单继承机制==

    1. 思考,如何让A类继承B类和C类。
    2. A继承B–》继承C
  7. 不能滥用继承,子类和父类之间必须满足is-a的逻辑关系

    1. animal
      1. Cat extents Animal 合理
    2. Person is Music
      1. person extend //不合理