尚硅谷JavaSE基础
6.6 基本特征二 继承
6.6.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中不允许的多继承是指多重继承, 也就是说一个类不允许有多个直接父类, 间接父类并没有个数限制. 称之为单继承.