抽象和继承
继承
面向对象的三大特征:封装、继承、多态
继承是多态的前提,如果没有继承,就没有多态
继承主要解决的问题是共性抽取
继承的特点
- 子类可以拥有父类的”内容“
- 子类还可以拥有自己专有的内容
继承的格式
/*
在继承关系当中,”子类就是一个父类“,也就是说子类可以当作一个父类看待
例如父类是员工,子类是讲师。那么”讲师就是一个员工“。
定义父类的格式://一个普通的类
public class 父类名称{
//...
}
定义子类的格式:
public class 子类名称 extends 父类名称{
//...
}
*/
//定义父类
public class Employee{
public void method("员工类~执行了");
}
//定义一个员工的子类
public class Teacher extends Employee{
}
继承中成员变量访问特点
/*
在父类的继承关系当中,如果成员变量,则创建子类对象时,访问有两种方式:
直接通过子类对象访问成员变量:
等号左边是谁,就有优先用谁,没有向上找。
间接通过成员方法访问成员变量:
该方法属于谁,就优先用谁没有则向上找。
*/
//定义父类
public class Fu {
int fuNum=100;
int num=200;
public void mthod() {
System.out.println(num);
}
}
//定义子类
public class Zi extends Fu {
int ziNum=300;
int num=400;
public void method() {
System.out.println(num);
}
}
//创建一个测试类
public class MainTest {
public static void main(String[] args) {
//定义一个子类
Zi zi=new Zi();
System.out.println(zi.fuNum);//100
System.out.println(zi.ziNum);//300
System.out.println(zi.num);//400
zi.method();//400
zi.mthod();//200
}
}
区分子类方法中重名的三种变量
/*
本类的成员变量 直接写成员变量名
局部成员变量 this.成员变量
父类成员变量 super.成员变量
*/
//定义父类
public class Fu {
int fuNum=100;
int num=200;
public void method() {
System.out.println(num);
}
}
//定义子类
public class Zi extends Fu {
int ziNum=300;
int num=400;
public void method() {
int num=500
System.out.println(num);//500
System.out.println(super.num);//200
System.out.println(this.num);//400
}
}
//创建一个测试类
public class MainTest {
public static void main(String[] args) {
//定义一个子类
Zi zi=new Zi();
zi.method();
}
}
继承中成员方法的访问特点
/*
在父子类继承关系当中,访问成员变量方法规则:
创建对象是谁就优先用谁,如果没有则向上找。
注意事项:
无论是成员方法还是成员变量,如果没有都是向上找的,绝对不会向下找子类的。
*/
方法的重写
概念:在继承关系中,方法的名称一样,参数列表也一样。
重写:(Override):方法的名称一样,参数列表【也一样】。也叫覆盖、重写
重载:(OverLoad):方法的名称一样,参数列表【不一样】。
方法的覆盖重写的特点:创建的子类对象,则优先使用子类方法。
注意事项:(了解)
- 必须保证父子类之间的名称相同,参数列表也相同。@Override:写在方法前面,用来检测是不是有效的正确覆盖重写。这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。
- 子方法的返回值必须【小于等于】父类方法的返回值范围,小扩展提示:java.long.Object类是所有类的公共最高父类(祖宗类),java.long.String就是Object的子类。zilei
- 子类方法的权限必须【大于等于】父类方法的权限修饰符,小扩展提示:public>protected>(default)>private,备注:(default)不是关键字default,而是什么都不写,留空。
super关键字的三种用法
- 在子类的成员方法中,访问父类的成员变量。
- 在子类的成员方法中,访问父类的成员方法。
- 在子类的构造方法中,访问父类的构造方法。
this关键字的三种用法
- 在本类的成员方法中,访问本类的成员变量。
- 在本类的成员方法中,访问本类的另一个成员方法。
- 在本类的构造方法中,访问本类的另一个构造方法。
继承相关的重要特征
java语言是单继承的
一个类的直接父类只能由唯一一个
java语言是多继承的
我有父亲 父亲有爷爷 爷爷还有祖爷爷
一个类的直接父类是唯一的,但是一个父类可以拥有很多子类。
抽象
/*
抽象方法:就是加上abstract关键字,去掉大括号,直接分号结束。
抽象类:抽象爱国发所在的类,必须是抽象类才行。在calss之前写上abstract即可
如何使用抽象类喝抽象方法:
不能直接创建new抽象类对象。
必须用一个子列来继承抽象父类
子类必须重写覆盖抽象父类当中所有的抽象方法
覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后补上方法体大括号。
创建子类对象进行使用。
*/
注意事项
- 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
- 抽象类中,可以有构造方法,是提供子类创建对象对象时,初始化父类成员使用的。
- 抽象类中,不一定包含抽象方法,但是含有抽象方法的类必定是抽象类。
- 抽象类的子类,必须重写抽象父类中的所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。