一、继承
1、定义
面向对象(OOP)三大特性:封装、继承、多态
类的继承就是在原有类的基础上创建新类,实现代码复用
“张三继承了他爹1美元的资产”,一般说到继承,默认是亲缘关系(父子、爷孙等)。如果将张三他爹作为一个类,这个类就叫父类;相应的,张三作为子类 。
在Java中Object是所有类的根,叫做基类(超类)
2、Dad和Son案例
Dad类目前有三个成员变量,财产,车子,是否抽烟。Son类想继承Dad类的前两个属性,因为Son不抽烟
① Dad类
② 子类采用extends关键字,可以引用父类中的属性和方法
③ 创建Test测试类,分别创建Dad和Son类的对象,并输出其属性
由于继承了Dad类,所以抽烟的习惯也继承了,但子类并不抽烟,所以这里需要在Son类中进行声明、覆盖
④ Son类不抽烟声明
⑤ Test测试类运行结果
这里我们是主动的对继承内容进行修改,但也存在被动的情况
也就是子类无法继承父类的构造方法
3、super 和 final 关键字
父类采用了带参数的构造方法,子类应该如何调用?
① super.父类成员变量/父类成员方法
和之前的this关键字类似,this指向的是本类对象,而super指向的是父类对象
父类属性:私房钱
父类方法:rushB()
stealMoney( )方法中调用了父类成员变量
play( )方法中调用了父类方法
运行结果
② final 关键字
和C语言中const,表示常量。可以修饰类、成员变量和成员方法。
1、修饰类表示最终类
通过extends可以实现类的继承,实际情况可能不希望某类发生变动,不希望它拥有任何子类,因此使用final关键字。此类无法作为父类派生出其他的子类,这样的类成为最终类
2、修饰变量表示常量
例如:
final PI = 3.14159;
3、修饰方法表示最终方法
被修饰的方法不能被覆盖,被称为最终方法,子类可以继承但是不允许重写的方法
二、多态
1、定义
多态是面对对象程序的第三大特征
多态是指在继承的关系下,对于相同的信息,不同的类采用不同的实现方法,即不同类的对象调用同名的办法,产生不同的行为
从字面上理解,“相同的表达式(命令),不同的操作”
2、方法重载
一个类定义了多个方法,名字相同,但是所含的参数类型和数量不同
不仅成员方法可以重载,构造方法也可以重载
3、方法覆盖
子类中拥有和父类相同方法名,相同参数类型和个数,但方法体(内容)不同
Animal父类:
public class Animal {
void say(){
System.out.println("我是一只动物");
}
}
Cat子类:
public class Cat extends Animal{
@Override
void say() {
System.out.println("我是一只小猫咪");
}
}
AnimalDemo测试类:
public class AnimalDemo {
public static void main(String[] args) {
Cat cat = new Cat();
cat.say();
}
}
运行结果(Cat类中的say方法覆盖掉了Animal父类中的say方法):
4、多态概念的引入
案例来自于韩顺平老师
1、主人给动物喂食物,初始情况如下图
Animal动物类
Cat和Dog类(Animal的子类)
Food类(和Animal一样)
public class Food {
private String name;
public Food(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Fish和Bone类(Food的子类)
public class Fish extends Food{
public Fish(String name) {
super(name);
}
}
public class Bone extends Food{
public Bone(String name) {
super(name);
}
}
2、Master主人类
问题是主人类中的喂养方法,这么写过于繁冗,如果再养几只动物,食物的种类也不同。类增加是必然的,但是feed()方法重复度过高。在这里我们采用多态的解决办法
由于Cat、Dog继承于Animal,Fish、Bone继承于Food。因此我们在创建对象时,进行修改
AnimalDemo(测试类)创建对象时:
Master(主人类)feed()方法进行修改:
并未报错且程序正常运行,具体内容我们下次讲解ヾ(●´∀`●)