精华笔记:
-
多态:多种形态
-
同一个对象被造型为不同的类型时,有不同的功能-------所有对象都是多态的(明天总结详细讲)
- 对象的多态:水、我、你......
同一类型的引用在指向不同的对象时,有不同的实现----所有抽象方法都是多态的
- 行为的多态: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); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用