多态变量
提示:这里可以添加技术概要
- java的对象变量是多态的,他们能保存不止一种类型的对象
- 它们可以保存的是声明类型的对象,或者声明类型的子类的对象
- 当把子类的对象赋给父类的变量的时候,就发生了向上造型
向上造型
造型
- 用括号围起类型放在值的前面
- 对象本身并没有发生任何变化
- 所以不是类型转换
- 运行时有机制来检查是否合理
- ClassCastException
- 子类的对象可以赋值给父类的变量
- 注意!Java中不存在对象对对象的赋值
String s = "hello";//(id=19)
s = "bye";//(id=23)
代码示意图

- 父类的对象不能赋值给子类的对象!
Vechicle v;
Car c = new Car();
v = c; //可以实现
c = v; //**编译出错**
- 可以用造型
Vechicle v = new Car();
c = (Car) v;
//只有当v这个变量实际管理的是Car才行
向上造型
- 拿一个子类的对象,当作父类的对象来用
- 向上造型是默认的,不需要运算符
- 向上造型总是安全的
函数调用的绑定
- 当通过对象变量调用函数的时候,调用哪个函数这件事情叫做绑定
- 静态绑定:根据变量的声明类型来决定
- 动态绑定:根据变量的动态类型来决定
- 在成员函数中调用其他成员函数是通过this这个对象变量来调用的
覆盖override
- 子类和父类中存在名称和参数表完全相同的函数,这一对函数构成覆盖关系
- 通过父类的变量调用存在覆盖关系的函数时,会调用变量当前所管理对象所属的类的函数
Object类
- 所有的类都是继承自Object的
-
toString();
-
equals();
-
城堡游戏
以框架+数据来提高可扩展性
- 命令的解析是否可以脱离if-else
- 定义一个Handler来处理命令
- 用Hash表来保存命令和Handler之间的关系
public class Handler {
public void doCmd(String cmd) {
}
}
...
private HashMap<String, Handler> handlers = new HashMap<>()'
抽象abstract
public abstract class Shape {
public abstract void draw();
}
抽象的类无法实例化
-
抽象函数——表达概念而无法实现具体代码的函数
-
抽象类——表达概念而无法构造出实体的类
-
带有abstrct修饰符的函数
-
有抽象函数的类一定是抽象类
-
抽象类不能制造对象
-
但是可以定义变量
- 任何继承了抽象类的非抽象类的对象可以赋给这个变量
-
继承自抽象类的子类必须覆盖父类中的抽象函数,否则自己成为抽象类
两种抽象
- 与具体相对
- 表示一种概念而非实体
- 与细节相对
- 表示一定程度上忽略细节而着眼大局
细胞自动机
黑点表示活着的细胞,白点表示死亡的细胞。
- 死亡:如果活着的邻居数量小于2或者大于3,则死亡
- 新生:如果正好有3个邻居或者,则新生
- 其他情况则保持原状
数据与表现分离

- 程序的业务逻辑与表现无关
- 表现可以是图形的也可以是文本的
- 表现可以是当地的也可以是远程的
View和Filed的关系
- 表现与数据的关系
- View只管根据Filed画出图形
- Field只管数据的存放
- 一旦数据更新以后,通知View重新画出整个画面
- 不去精心设计哪个局部需要更新
- 简化了程序逻辑,是在计算机运算速度提高的基础上实现的
责任驱动的设计
- 将程序要实现的功能分配到合适的类/对象中去是设计中飞、非常重要的一环
网格化
- 图形界面本身有更高的解析度
- 但是将画面网格化后,数据就更容易处理了
Questions
- 为什么不是在Cell提供
- setAlive(boolean)
- 函数?而是采用复杂的die()、reborn()两个函数
- 为什么Field.getNeighbour()不直接看Cell.isAlive()来返回一个数字,而是要返回一个数组让外面来数数?
- 为什么不是有Cell自己判断自己的邻居的情况来决定自己是否应该被die或reborn?(会增加Cell与Filed的耦合)
狐狸与兔子
- 狐狸和兔子都有年龄
- 当年龄到了一定的上线就会自然死亡
- 狐狸可以随机决定在周围的兔子中吃一个
- 狐狸和兔子可以随机决定生一个小的,放在旁边的空格子中
- 如果不吃也不生,狐狸和兔子可以随机决定向旁边的空格子走一步

Cells类的定位 - 在Cells程序中它表达了细胞
- 但是同时他也表达了放在网格里的一个格子
- Fox和Rabbit是否应该从Cell继承?
所有的OOP语言都不支持多继承,除了C++

本文介绍了Java中的多态特性,包括对象变量的多态性、向上造型的概念、函数绑定(静态与动态)、抽象类和方法覆盖。还探讨了城堡游戏中的命令处理和细胞自动机模型,强调了数据与表现的分离以及责任驱动设计原则。

7269

被折叠的 条评论
为什么被折叠?



