继承
概述
如果多个类中存在相同的属性和行为时,将这些内容抽取到单独的一个类中,那么多个类就无需再定义这些属性和行为,只要去继承这个单独的类即可。
其中,多个类称为子类,派生类,单独的那一个类称为父类、超类(superclass)、基类
继承描述的是事物之间二队所属关系,这种关系是:is - a 的关系,在继承关系中,子类就是一个父类。也即是说,子类可以被当作父类看待。
例如:父类是员工,子类是讲师,那么"讲师就是一个员工"。
一般情况下,父类更通用,子类更具体。我们可以通过继承,使多种事物之间形成一种关系体系。
定义
继承:就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为、子类可以直接访问父类中的【非私有】的属性和行为。
好处:
-
可以提高代码的复用性。
-
类与类之间可以产生一种关系,是【多态】的前提。
继承的格式
通过extends关键字,可以声明一个子类继承一个父类:
public class FuClass{
//....
}
public class ZiClass extends FuClass{
//....
}
代码演示:
/*
定义一个员工类Employee,父类
*/
public class Employee{
String name;// name属性
int id;// 工号属性
// 定义一个员工的工作方法
public void work(){
System.out.println("努力的工作!");
}
}
/*
定义讲师类Teacher 继承 员工类Employee
*/
public class Teacher extends Employee{
// 定义讲师类中的专有的方法
public void teach(){
System.out.println(name + "在教课");
}
}
/*
定义一个测试
*/
public class TestExtendsDemo01{
public static void main(String[] args){
// 创建一个讲师类
Teacher t = new Teacher();
// 为该员工类的name属性赋值
t.name = "小张";
// 调用该员工中的教课的方法
t.teach();
// 调用Teacher类继承过来的work()方法
t.work();
}
}
继承后的特点----成员变量
当类之间产生了关系后,其中各类的成员变量有哪些影响?
成员变量不重名
如果子类父类中定义的成员变量名字不重名,这时的访问没有任何影响。
public class Fu{
// 定义一个变量
int num = 10;
}
public class Zi extends Fu{
// 定义一个变量
int num2 = 20;
// 定义一个子类的成员方法
public void show(){
// 访问父类中的成员变量 num
System.out.println("父类中的成员变量num = " + num); // 10 继承而来的,可以直接访问
// 访问子类中的成员变量 num2
System.out.println("子类中的成员变量num2 = " + num2); // 20
}
}
public class TextExtendsField{
public static void main(String[] args){
// 创建子类的对象
Zi zi = new Zi;
// 调用子类的方法
zi.show();
}
}
成员变量重名
如果子类父类出现重名的成员变量,这时的访问是有影响的。
public class Fu{
// 定义父类中的成员变量
int num = 10;
}
public class Zi extends Fu{
// 定义子类中的成员变量
int num = 20;
// 定义子类中的成员方法
public void show(){
System.out.println("父类中的成员变量num = " + num);//20
System.out.println("子类中的成员变量num = " + num);//20
}
}
在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:
直接通过子类对象访问成员变量:等号左边是谁,就优先用谁,没有会向上找
间接通过成员方法访问成员变量:该方法属于谁,就优先用谁,没有则继续向上找。
子父类中出现了重名的成员变量时,在子类中想要访问父类中的非私有的成员变量时,需要使用"super"
关键字,修饰父类的成员变量,类似于this操作。
使用格式:
super.父类的成员变量名
子类方法中的代码需要修改
public class Zi extends Fu{
// 定义子类中的成员变量
int num = 20;
// 定义子类中的成员方法
public void show(){
System.out.println("父类中的成员变量num = " + super.num);//10
System.out.println("子类中的成员变量num = " + num);//20
}
}
备注:Fu类中的成员变量是非私有的,子类中可以直接访问。若Fu类中的成员变量私有了,子类不能直接访问。通常编码时,我们遵循的是封装的原则,使用private关键字修饰成员变量,那么如何访问父类中的私有成员变量呢?可以借助于父类中的提供的公共的setXxx和getXxx方法