面对对象的三大特征:封装性、继承性、多态性。
继承是多态的前提,如果没有继承,就没有多态。
继承主要解决的问题就是:共性抽取
继承关系当中的特点:
1.子类可以拥有父类的“内容”。
2.子类还可以拥有自己专有的内容。
父类也可以叫基类、超类。
子类也可以叫派生类。
父类、子类定义的格式:
在继承的关系中,“子类就是一个父类”。也就是说,子类可以被当做父类看待。
例如父类是员工,子类是讲师,那么“讲师就是一个员工”。关系:is a
定义父类的格式(一个普通的类定义)
public class 父类名称 {
//…
}
定义子类的格式:
public class 子类名称 extends 父类名称 {
//…
}
public class Demo01Extends {
public static void main(String[] args) {
//创建了一个子类对象
Teacher teacher = new Teacher();
//Teacher类当中虽然什么都没写,但是会继承来自父类的method方法。
//调用继承下来的Employee的method方法
teacher.method();
//创建另一个子类对象,助教
Assistant assistant = new Assistant();
Assistant.method();
}
}
继承关系
在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:
直接通过子类对象访问成员变量:
等号左边是谁,就优先用谁,没有则向上找
间接通过成员方法访问成员变量:
该方法属于谁,就优先用谁,没有则向上找
public class Demo01ExtendsField {
public static void main(String[] args) {
Fu fu = new Fu();//创建父类对象
System.out.println(fu.numFu);//只能使用父类的东西,没有任何子类内容
Zi zi = new Zi();
System.out.println(zi.numFu);//10
System.out.println(zi.numZi);//20
//直接访问等号左边是谁,就优先用谁,没有则向上找
System.out.println(zi.num);//200
System.out.println(fu.num);//100
// System.out.println(zi.abc);//向上找父类也没有对象,编译报错
System.out.println("================");
//这个方法是子类的,优先用子类的,没有再向上找
zi.methodZi();//200
//这个方法是在父类当中定义的
zi.methodFu();//100
}
}
public class Fu {
int numFu = 10;
int num = 100;
public void methodFu() {
//使用的是本类当中的,不会向下找子类的。
System.out.println(num);
}
}
public class Zi extends Fu {
int numZi = 20;
int num = 200;
public void methodZi() {
//因为本类当中有num,所有这里用的是本类的num
System.out.println(num);
}
}
区分子类方法中重名的三种变量
局部变量: 直接写成员变量名
本类的成员变量: this.成员变量名
父类的成员变量: super.成员变量名
public class Demo01ExtendsFiled {
public static void main(String[] args) {
Zi zi = new Zi();
zi.method();
}
}
public class Zi extends Fu{
int num = 20;
public void method() {
int num = 30;
System.out.println(num);//30
System.out.println(this.num);//20本类的成员变量
System.out.println(super.num);//10父类的成员变量
}
}