面向对象第9天:
回顾:
1.接口:
-
是一种数据类型(引用类型)
-
由interface定义
-
只能包含常量和抽象方法(所有数据默认都是常量,所有方法默认都是抽象的)
-
接口不能被实例化
-
接口是需要被实现/继承的,实现/派生类:必须重写所有抽象方法
-
一个类可以实现多个接口,用逗号分隔。若又继承又实现时,应先继承后实现。
-
接口可以继承接口
精华笔记:
-
多态:多种形态
-
同一个对象被造型为不同的类型时,有不同的功能-------所有对象都是多态的(明天总结详细讲)
- 对象的多态:水、我、你......
同一类型的引用在指向不同的对象时,有不同的实现----所有抽象方法都是多态的
- 行为的多态:cut()、getImage()、move()......
-
向上造型/自动类型转换:
- 超类型的引用指向派生类的对象------前面是超类型,后面是派生类型
- 能点出来什么,看引用的类型
- 能造型成为的数据类型:超类+所实现的接口
-
强制类型转换,成功的条件只有两种:
- 引用所指向的对象,就是该类型
- 引用所指向的对象,实现了该接口或继承了该类
-
强转时若不满足如上条件,则发生ClassCastException类型转换异常
建议:在强转之前先通过instanceof来判断引用指向的对象是否是该类型
说明:instanceof会返回true或false的结果
如果满足强转成功的条件则返回true,否则返回false
何时需要强转:向上造型后,若想访问的东西在超类中没有,则需要强转
-
笔记:
-
多态:多种形态
-
同一个对象被造型为不同的类型时,有不同的功能-------所有对象都是多态的(明天总结详细讲)
- 对象的多态:水、我、你......
同一类型的引用在指向不同的对象时,有不同的实现----所有抽象方法都是多态的
- 行为的多态:cut()、getImage()、move()......
-
向上造型/自动类型转换:
- 超类型的引用指向派生类的对象------前面是超类型,后面是派生类型
- 能点出来什么,看引用的类型
- 能造型成为的数据类型:超类+所实现的接口
-
强制类型转换,成功的条件只有两种:
- 引用所指向的对象,就是该类型
- 引用所指向的对象,实现了该接口或继承了该类
-
强转时若不满足如上条件,则发生ClassCastException类型转换异常
建议:在强转之前先通过instanceof来判断引用指向的对象是否是该类型
说明:instanceof会返回true或false的结果
如果满足强转成功的条件则返回true,否则返回false
何时需要强转:向上造型后,若想访问的东西在超类中没有,则需要强转
public class MultiTypeDemo { public static void main(String[] args) { //成功的条件1:引用所指向的对象,就是该类型 //成功的条件2:引用所指向的对象,实现了该接口或继承了该类 Aoo o = new Boo(); //向上造型 Boo o1 = (Boo)o; //引用o所指向的对象,就是Boo类型-----------符合条件1 Inter o2 = (Inter)o; //引用o所指向的对象,实现了Inter接口---符合条件2 //Coo o3 = (Coo)o; //运行时会发生ClassCastException类型转换异常 if(o instanceof Coo){ //false Coo o4 = (Coo)o; }else{ System.out.println("o不是Coo类型"); } } } interface Inter{ } class Aoo{ } class Boo extends Aoo implements Inter{ } class Coo extends Aoo{ }
-
补充:
-
体会接口的好处:
//复用性好、扩展性好、维护性好------------------高质量代码 //被撞的是ObserveSubmarine-----调用ObserveSubmarine的getScore()-----10分 //被撞的是TorpedoSubmarine-----调用TorpedoSubmarine的getScore()-----40分 //被撞的是NuclearSubmarine-----调用NuclearSubmarine的getScore()-----100分 if(s instanceof EnemyScore){ //------适用于所有实现EnemyScore接口的 EnemyScore es = (EnemyScore)s; score += es.getScore(); } //被撞的是MineSubmarine--------调用MineSubmarine的getLife()---------1 //被撞的是NuclearSubmarine-----调用NuclearSubmarine的getLife()------3 if(s instanceof EnemyLife){ //-------适用于所有实现EnemyLife接口的 EnemyLife el = (EnemyLife)s; int num = el.getLife(); ship.addLife(num); } //复用性差、扩展性差、维护性差------------------垃圾代码 if(s instanceof ObserveSubmarine){ //---------只能适用于ObserveSubmarine的 ObserveSubmarine os = (ObserveSubmarine)s; score += os.getScore(); } if(s instanceof TorpedoSubmarine){ //---------只能适用于TorpedoSubmarine的 TorpedoSubmarine ts = (TorpedoSubmarine)s; score += ts.getScore(); } if(s instanceof MineSubmarine){ //---------只能适用于MineSubmarine的 MineSubmarine ms = (MineSubmarine)s; int num = ms.getLife(); ship.addLife(num); } if(s instanceof NuclearSubmarine){ //---------只能适用于NuclearSubmarine NuclearSubmarine ns = (NuclearSubmarine)s; score += ns.getScore(); int num = ns.getLife(); ship.addLife(num); }
-
明日单词:
1)subtract:减 2)gameover:结束 3)running:运行