精华笔记:
-
多态:多种形态
-
意义:
-
同一个对象被造型为不同的类型时,有不同的功能------所有对象都是多态的
----对象多态:我、你、水......
-
同一类型的引用指向不同的对象时,有不同的实现------所有抽象方法都是多态的
----行为多态:cut()、getImage()、move()、getScore()......
-
-
向上造型/自动类型转换:
-
超类型的引用指向派生类的对象(前面是超类型,后面是派生类型)
-
能点出来什么,看引用的类型(这是规定)
-
能向上造型成为的类型有:超类+所实现的接口
-
-
强制类型转换,成功的条件只有如下两种:
-
引用所指向的对象,就是该类型
-
引用所指向的对象,实现了该接口或继承了该类
-
-
强转若不符合如上条件,则发生ClassCastException类型转换异常
建议:在强转之前一定要先通过instanceof来判断引用的对象是否是该类型
强转时若符合如上的两个条件,则instanceof返回true,若不符合则返回false
何时需要强转:你想访问的东西在超类中没有,那就需要强转
-
笔记:
-
多态:多种形态
-
意义:
-
同一个对象被造型为不同的类型时,有不同的功能------所有对象都是多态的
----对象多态:我、你、水......
-
同一类型的引用指向不同的对象时,有不同的实现------所有抽象方法都是多态的
----行为多态:cut()、getImage()、move()、getScore()......
-
-
向上造型/自动类型转换:
-
超类型的引用指向派生类的对象(前面是超类型,后面是派生类型)
-
能点出来什么,看引用的类型(这是规定)
-
能向上造型成为的类型有:超类+所实现的接口
-
-
强制类型转换,成功的条件只有如下两种:
-
引用所指向的对象,就是该类型
-
引用所指向的对象,实现了该接口或继承了该类
-
-
强转若不符合如上条件,则发生ClassCastException类型转换异常
建议:在强转之前一定要先通过instanceof来判断引用的对象是否是该类型
强转时若符合如上的两个条件,则instanceof返回true,若不符合则返回false
何时需要强转:你想访问的东西在超类中没有,那就需要强转
public class MultiType {public static void main(String[] args) {//条件1:引用所指向的对象,就是该类型//条件2:引用所指向的对象,实现了该接口或继承了该类Aoo o = new Boo(); //向上造型Boo o1 = (Boo)o; //引用o所指向的对象,就是Boo类型-------符合条件1Inter o2 = (Inter)o; //引用o所指向的对象,实现了Inter接口---符合条件2//Coo o3 = (Coo)o; //运行时会发生ClassCastException类型转换异常 //判断o是否是Coo类型(与强转成功条件完全匹配)if(o instanceof Coo){ //falseCoo o4 = (Coo)o; //instanceof若为true,则强转一定成功}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){ //---------只能适用于NuclearSubmarineNuclearSubmarine ns = (NuclearSubmarine)s;score += ns.getScore();int num = ns.getLife();ship.addLife(num); }