尚硅谷JavaSE基础

6.6 基本特征二 继承

6.6.1 继承

  1. 继承的概念

一个类从另外一个类继承所有成员, 包括属性和方法, 但是不包括构造器和语句块

从现有类创建子类, 现有类就称为父类, 基类, 超类.

为描述和处理个人信息,定义类Person:

Person

+name : String

+age : int

+birthDate : Date

+getInfo() : String

public class Person {

      public String name;

      public int age;

      public Date birthDate;

      public String getInfo()   

     {...}

}

为描述和处理学生信息,定义类Student:

Student

+name : String

+age : int

+birthDate : Date

+school : String

+getInfo() : String

public class Student {

      public String name;

      public int age;

      public Date birthDate;

      public String school;

      public String getInfo()  

     {...}

}

2. 为什么要继承

  • 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
  • 此处的多个类称为子类,单独的这个类称为父类(基类或超类)。可以理解为:“子类 is a 父类”

当一个类和另外一个类的属性和方法完全相同, 并且同时又比另一个类多一些特有的属性和方法时, 前者就可以作成后者的子类, 子类继承父类的所有成员, 这样, 在子类中就可以省略从父类继承的成员, 便于代码的复用, 以及更统一的类型管理.

3. 继承语法

class 子类 extends 父类 {}

从语法意思来看, 子类是扩展自父类, 也可以理解为子类是在以父类为基础的前提下, 进一步扩展一些属性和方法, 所以子类大于父类, 或者也可以说, 子类包含父类.

  • 通过继承,简化Student类的定义:

public class Person {

      public String name;

      public int age;

      public Date birthDate;

      public String getInfo() {...}

public class Student extends Person{

      public String school;

}

//Student类继承了父类Person的所有属性和方法,并增加了一个属性school。

//Person中的属性和方法,Student都可以使用。

  • 作用:
    • 继承的出现提高了代码的复用性。
    • 继承的出现让类与类之间产生了关系,提供了多态的前提。
    • 不要仅为了获取其他类中某个功能而去继承

4. 继承的特点

①子类继承父类的所有成员(构造器除外), 就意味着父类的私有成员也会被子类继承, 但是因为私有成员只能被本类访问, 所以即使是在子类中也不能直接访问从父类继承的私有成员, 可以通过从父类继承的公共的get/set方法间接访问.

public class Person {

      private String name;

      private int age;

      private Date birthDate;  

      public void setName(String name) {

          this.name = name;

}

      public String getInfo() {...}

}

public class Student extends Person{

      public String school;

      public void test() {

          //name = “小明”; // 不可以, 因为是私有的

          setName(“小明”);// 可以, 通过公共方法间接访问

}

}

Java只支持单继承,不允许多重继承

一个子类只能有一个直接父类

一个父类可以派生出多个子类

class SubDemo extends Demo{ }   //ok

class SubDemo extends Demo1,Demo2...//error

  在继承关系中, 一个类Person可以被另外的类Soldier和Student和Officer继承, 然后Student又被Graduate类继承, 这是允许的, 在这样的体系中, Graduate类也称为Person类的子类, Person类也称为Graduate类的父类, 这样的继承我们称之为多层继承. 在这样的体系中, Student类称为Graduate类的直接父类, 显然地, Person类称为Graduate类的间接父类, 在java中, 多层继承是被允许的.

Java中不允许的多继承是指多重继承, 也就是说一个类不允许有多个直接父类, 间接父类并没有个数限制. 称之为单继承.