面向对象-继承和多态
1.什么是继承
多个类中存在相同的属性和行为,将这些属性和行为提取到单独的类中,那么多个类中无需再次定义这些属性和行为,只需继承那个类即可。
通过关键字extends可以实现类与类的继承。
class 子类名 extends 父类名{}
案例:学生类和老师类,定义两个功能(吃饭和学习),都同时为人类
class Person{
String name;
int age;
public void eat(){ System.out.println("吃饭");}
public void study(){ System.out.println("学习");}
}
class Student extends Person{ }
class Teacher extends Person{ }
public class Test{
public static void main(String[] args){
Student student = new Student();
student.eat();
student.study();
Teacher teacher = new Teacher();
teacher.eat();
teacher.study();
{
{
继承的优缺点:
1)提高了代码的复用性。
2)提高了代码的维护性。
3)让类与类产生了关系,是多态的前提,同时也是缺点耦合性很强。
继承的特点:
1)一个类只能有一个父类。
2)支持多层继承。
class A{}
class B extends A{}
class C extends B{}
注意事项:子类只能继承父类所有非私有的成员(成员方法和成员变量) 。
其实这也体现了继承的另一个弊端:打破了封装性
子类不能继承父类的构造方法,但是可以通过super(后面讲)关键字去访问父类构造方法。
不要为了部分功能而去继承。
继承中成员变量的关系
在子类方法中访问一个变量
首先在子类局部范围找
然后再子类成员范围找
最后再父类成员范围找(肯定不能访问到父类局部范围)
如果还是没有就报错(不考虑父类的父类...)
super关键字
super的用法和this很像
this代表本类对应的引用。
super代表父类存储空间的标识(可以理解为父类引用)
用法(this和super均可如下使用)
访问成员变量
this.成员变量 super.成员变量
访问构造方法
this(…) super(…)
访问成员方法
this.成员方法() super.成员方法()
继承中构造方法的关系
子类中所有的构造方法默认都会访问父类中空参数的构造方法 , 因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。 每一个构造方法的第一条语句默认都是:super()。
如何父类中没有构造方法,子类通过super去显示调用父类其他的带参的构造方法 子类通过this去调用本类的其他构造方法 本类其他构造也必须首先访问了父类构造 一定要注意: super(…)或者this(….)必须出现在第一条语句山 否则,就会有父类数据的多次初始化。
通过子类对象去访问一个方法
首先在子类中找 然后在父类中找 如果还是没有就报错。(不考虑父类的父类…)
方法重写概述
子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖,方法复写。
使用特点: 如果方法名不同,就调用对应的方法 如果方法名相同,最终使用的是子类自己的 方法重写的应用: 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
方法重写的注意事项
父类中私有方法不能被重写 子类重写父类方法时,访问权限不能更低 父类静态方法,子类也必须通过静态方法进行重写。(其实这个算不上方法重写,但是现象确实如此)
final关键字
final关键字是最终的意思,可以修饰类,成员变量,成员方法。 修饰类,类不能被继承 修饰变量,变量就变成了常量,只能被赋值一次 修饰方法,方法不能被重写
1.什么是多态。
一个事物在不同时刻表现出来的不同状态。
举例:猫可以是猫的类型。猫 a = new 猫();
猫也是动物的一种,也可以把猫称为动物。动物 b = new 猫();
注意:多态前提是有继承关系、有方法重写、有父类引用指向子类对象。