java学习随笔2

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

多态变量

提示:这里可以添加技术概要

  • 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++

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值