精华笔记:
-
多态:多种形态
-
意义:
-
同一个对象被造型为不同的类型时,有不同的功能---------所有对象都是多态的(明天详细讲)
-----对象的多态:我、你、水…
-
同一类型的引用在指向不同的对象时,有不同的实现------所有抽象方法都是多态的
-----行为的多态:cut()、move()、getImage()、getScore()…
-
- 向上造型/自动类型转换:
-
超类型的引用指向派生类的对象
-
能点出来什么,是看引用的类型。
-
-
能造型成为的类型有:超类+所实现的接口
-
强制类型转换(向下转型),成功的条件只有如下两种:
-
引用所指向的对象,就是该类型
-
引用所指向的对象,继承了该类或实现了该接口
-
强转时若不符合如上条件,则发生ClassCastException类型转换异常
建议在强转之前先通过instanceof来判断引用指向的对象是否是该类型
何时需要强转:若想访问的变量/方法在超类中没有,则需要强转
-
3 .注意区分
- 向上造型--------------能点出来什么,是看引用的类型。
- 强制类型转换-----------(两个成功条件满足其一后)才能点出来什么,再看引用的类型。
- 重写方法被调用时---------------------看对象的类型。
笔记:
-
多态:多种形态
-
意义:
-
同一个对象被造型为不同的类型时,有不同的功能---------所有对象都是多态的
-----对象的多态:我、你、水…
-
同一类型的引用在指向不同的对象时,有不同的实现------所有抽象方法都是多态的
-----行为的多态:cut()、move()、getImage()、getScore()…
-
-
// 同一个对象被造型为不同的类型时,
//有不同的功能-所有对象都是多态的
water w = new water();
液态 o1 = water;
气态 o2 = water;
固态 o3 = water;
o1.灌溉();
o2.充气();
o3.降温();
interface 液态{
void 灌溉();
}
interface 固态{
void 降温();
}
interface 气态{
void 充气();
}
class water implements 液态,固态,气态{
public viod 充气(){};
public viod 降温(){};
public viod 灌溉(){};
}
// 同一类型的引用在指向不同的对象时,
//有不同的实现-所有抽象方法都是多态的
人 o1 = new 厨师();
人 o2 = new 理发师();
人 o3 = new 外科医生();
o1.cut();//切菜
o2.cut();//剪发
o3.cut();//开刀
abstract class 人{
abstrart void cut();
}
class 厨师 extends 人{
void cut(){切菜}
}
class 理发师 extends 人{
void cut(){剪发}
}
class 外科医生 extends 人{
void cut(){开刀}
}
-
向上造型/自动类型转换:
-
超类型的引用指向派生类的对象
-
能点出来什么,是看引用的类型。
-
能造型成为的类型有:超类+所实现的接口
-
-
强制类型转换(向下转型),成功的条件只有如下两种:
- 引用所指向的对象,就是该类型
- 引用所指向的对象,继承了该类或实现了该接口
-
强转时若不符合如上条件,则发生ClassCastException类型转换异常
建议在强转之前先通过instanceof来判断引用指向的对象是否是该类型
何时需要强转:若想访问的变量/方法在超类中没有,则需要强转
public class MultiTypeDemo { public static void main(String[] args) { //成功的条件1:引用所指向的对象,就是该类型 //成功的条件2:引用所指向的对象,继承了该类或实现了该接口 Aoo o = new Boo(); //向上造型 Boo o1 = (Boo)o; //引用o所指向的对象,就是Boo类型 Inter o2 = (Inter)o; //引用o所指向的对象,实现了Inter接口 //Coo o3 = (Coo)o; //运行时发生ClassCastException类型转换异常 if(o instanceof Coo){ //true Coo o4 = (Coo)o; } System.out.println(o instanceof Boo); //true System.out.println(o instanceof Inter); //true System.out.println(o instanceof Coo); //false } } 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); }