Lecture 5 如何管理对象

  1. 对象与引用:

    (1)对象是什么:

    • 对象是程序通过new产生的实例
    • 对象是堆内存中的一个区域,包含属性数据和指向类的指针
    • 方法定义在类中而不是对象中

    (2)对象引用是什么:

    • 指向对象内存地址的指针,用以访问对象成员及其属性和方法
    • 对象引用可能为null
    • 改变对象引用的取值不会导致被引用对象数据的改变

    (3)区别与联系

    • 当堆中某个对象无法被程序访问时,Java垃圾回收机制会自动回收内存。
    • 改变对象内容的唯一方法是通过对象引用去访问其修改方法
    • 对象引用是一个变量(类似于C语言的指针型变量),对象引用内容的改变可以随时通过变量赋值实现
  2. Java常见容器及其作用:

    (1)ArrayList:可伸缩数组

    (2)LinkedList:可伸缩链表

    • 优点:当我们需要保持对象的顺序关系并且按照下标访问时,采用ArrayList或者LinkedList是比较好且比较简单的选择
    • 缺点:查找某个对象需要遍历,查找速度较慢

    (3)HashMap:哈希表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Adeventurer {
    //parameters
    public HashMap<Integer,Adventurer> Adventurers = new HashMap<>(); //声明一个储存Adeventurer类的容器
    }

    public class AdventurerOperation {
    public void addAdventurer(int advId, String advName) { //给HashMap添加元素
    Adeventurer adventurer = new Adventurer(/*parameter*/); //创造一个新的Adventurer对象
    adventurers.put(advId,adventurer);
    }
    }
    • HashMap是一个基于哈希表的键值对映射,其中元素没有固定顺序
    • 不允许重复键

    (4)HashSet:哈希集

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import java.util.HashSet;

    public class Adventurer {
    //parameters
    HashSet<Bottle> bottles;
    //构造方法
    public newAdvBottle (Adventurer adventurer) {
    adventurer.bottles = new HashSet<>();
    }
    //添加元素
    public void addBottle (Bottle bottle) {
    bottles.add(bottle);
    }
    //删除元素
    public void removeBottle (Bottle bottle) {
    bottles.remove(bottle);
    }
    //判断是否包含元素
    public boolean hasBottle (Bottle bottle) {
    return bottles.contains(bottle);
    }
    //遍历
    public void printAll() {
    for (Bottle obj : bottles) {
    System.out.println(obj.getName());
    }
    }
    }
    • HashSet是基于哈希表实现的无序集合,不允许储存重复的元素,它的本质是只存key的HashMap

    • 优点:保持集合元素的互异,当需要实现自动去重功能去管理对象的时候,使用HashSet是比较好的选择

    • 缺点:内部储存无序
  3. 层次化对象管理方法

    • 使用容器管理一组对象
    • 一个对象可以内置容器来管理其下一层次的对象

    对象之间的关系可以分为组合关系与聚合关系

    (1)组合关系(composition):

    多个对象组合形成一个更大的对象,如车轮,发动机等组合形成汽车

    组合关系中的上层建筑以对象引用或容器作为属性变量,形成对象之间整体和部分的结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Car {
    private Engine engine;
    private Wheel wheel; // 对象引用属性作为属性变量

    public Car () {
    this.engine = new Engine;
    this.wheel = new Wheel;
    }
    }

    (2)聚合关系(Aggregation):

    以对象引用作为其成员变量,对象引用可为null

    Adventurer类与Bottle类和Equipment类的关系就是聚合关系

    这与组合逻辑的区别在于:发动机,车轮等构成了车,没有车轮就不会构成车,这是一种整体与部分的关系。但是冒险者可以没有水瓶而仍然是冒险者,这是一种拥有与被拥有的关系。