面向对象的三大特征:封装、继承、多态。今天重点来看一下“多态”。
封装
指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。将属性或方法进行封装,防止外部程序随机访问,加强代码的安全性。
继承
子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
子类继承父类,使用extends关键字。
子类可以访问父类那些属性和方法?
private | 本类 | |||
默认省略(default) | 本类 | 同包 | ||
protected | 本类 | 同包 | 非同包子类 | |
public | 本类 | 同包 |
非同包子类 |
其他任何包都可用 |
1 //类的继承格式
2
3 class 父类 {
4
5 }
6
7 class 子类 extends 父类{
8
9 }
多态
终于进入到今天的重点了!
多态是同一种事物,由于条件的不同,展示出不同的结果。
在程序中多态就是同一种引用类型,由于使用不同的对象实例,而执行不同地操作。
例如:猫吃鱼,狗啃骨头。不是多态;
在动物界,有的小动物吃鱼,有的小动物啃骨头。就是多态。
多态的优点:
1. 消除类型之间的耦合关系
2. 可替换性
3. 可扩充性
4. 接口性
5. 灵活性
6. 简化性
实现多态的条件:
① 子类继承父类;
② 子类重写父类方法;
③ 父类引用指向子类对象。保证了同一个父类引用类型,使用不同的子类对象实例,而执行不同的操作。
1 /**
2 * 乐器(Instrument)类包括:钢琴(Piano)类、小提琴(Violin)类;
3 * 乐器类必须是抽象类,其中要有抽象方法(保证子类重写父类方法)
4 * 各种乐器的弹奏( play )方法各不相同
5 * 演奏家来演奏乐器
6 */
7
8
9 //乐器类
10 public abstract class Instrument { //抽象类
11 public abstract void play(); //抽象方法,子类必须重写父类对象
12 }
13
14 //钢琴类
15 public class Piano extends Instrument{ //继承父类
16 public void play(){ //重写方法
17 System.out.println("弹奏钢琴"); //钢琴弹奏方法
18 }
19 }
20
21 //小提琴类
22 public class Violin extends Instrument{ //继承父类
23 public void play(){ //重写方法
24 System.out.println("演奏小提琴"); //小提琴弹奏方法
25 }
26 }
27
28 //演奏家类
29 public class Artist {
30 public void make(Instrument i){ //传入“乐器”参数,哪个乐器调用哪个方法
31 System.out.println("演奏家:"+name);
32 i.play();
33 }
34 }
35
36 //Test类
37 public class Test {
38 public static void main(String[] args) {
39 Artist a=new Artist("xxx"); //父类引用指向子类对象
40 //相当于Instrument i = new Piano() ;实例化一个子类对象,i存的是一个地址。
41 a.make(new Piano()); //传进的对象不同,可调用一样的方法,结果不同。以 Piano 对象调用“演奏家类”中的 make 方法。
42 a.make(new Violin());
43 }
44 }
执行以上程序,输出结果为: