# 继承

继承是面向对象三大特征之一,封装之后形成了独立体,独立体A和独立体B之间可能存在继承关系。其实程序中的继承灵感来自于现实生活,在现实生活中继承处处可见,例如,儿子继承了父亲的财产,儿子不需要努力就很有钱。

继承时子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性,或子类从父类继承方法,使得子类具有与父类相同的行为。兔子和羊属于食草动物类,狮子和豹属于食肉动物类。食草动物和食肉动物又是属于动物类。所以继承需要符合的关系是:is-a(Bird is-a Animal),父类更通用,子类更具体。虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。

为什么要使用继承机制?在不同的类中也可能会有共同的特征和动作,可以把这些共同的特征和动作放在一个类中,让其它类共享。因此可以定义一个通用类,然后将其扩展为其它多个特定类,这些特定类继承通用类中的特征和动作。继承是 Java 中实现软件重用的重要手段,避免重复,易于维护。

语法:

class 类名 extends 父类名{
// 类体
}
1
2
3

备注:
使用 extends 继承父类

// Address.java
public class Address {
    private String address;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

// Person
public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

// Student.java 继承 Person 类
public class Student extends Person{
    private double score;
    private Address address;

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
    public Address getAddress() {
        return  address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
}

// StudentTest.java
public class StudentTest {
    public static void main(String[] args) {
        Student s = new Student();
        s.setName("'张三'");
        s.setAge(28);
        s.setScore(100.00);
        System.out.println("name: " + s.getName()); // 张三
        System.out.println("age: " + s.getAge()); // 28
        System.out.println("score: " + s.getScore()); // 100.0

        /**
         *  Student类中成员变量 address 是Address类型是引用类型
         *  s.getAddress().getAddress() 第一个get是获取第一层数据,是Address引用类型,所以第二层get获取是address数据
         */
        Address address = new Address();
        address.setAddress("彦霖路");
        s.setAddress(address);
        System.out.println(s.getAddress().getAddress()); // 彦霖路
    }
}
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

备注:

  • B类继承A类,则称A类为超类(superclass)、父类、基类,B类则称为子类(subclass)、派生类、扩展类。
  • java中的继承只支持单继承,不支持多继承。
  • java中不支持多继承,但可以间接继承,例如:class C extends B,class B extends A,也就是说,C直接继承B,其实C还间接继承A。
  • ava中规定,子类继承父类,除构造方法和被private修饰的数据不能继承外,剩下都可以继承。
  • java中的类没有显示的继承任何类,则默认继承Object类,Object类是java语言提供的根类(老祖宗类),也就是说,一个对象与生俱来就有Object类型中所有的特征。
  • 继承缺点,例如:B类继承A类会导致它们之间的耦合度非常高,A类发生改变之后会马上影响到B类。
  • 继承优点,继承解决了代码复用的问题