Day13
- Object
1.1 概述
- Object : 是java中 提供的一个根类(祖宗)
- 所有类都直接或者间接的继承了Object
- 如果一个类没有显示继承一个父类的话,那么该类默认继承Object
- 既然Object是所有类的祖类,也就意味着 Object中的方法是所有类都有的功能
- Object xxx = new xxxx() ; 是可以发生多态的
- 因为多态的原因,如果一个方法需要传递的数据,我们不能确定数据的类型的时候,可以写Object
Day13
- Object
1.1 概述
- Object : 是java中 提供的一个根类(祖宗)
- 所有类都直接或者间接的继承了Object
- 如果一个类没有显示继承一个父类的话,那么该类默认继承Object
- 既然Object是所有类的祖类,也就意味着 Object中的方法是所有类都有的功能
- Object xxx = new xxxx() ; 是可以发生多态的
- 因为多态的原因,如果一个方法需要传递的数据,我们不能确定数据的类型的时候,可以写Object
今天我们只讲解 : equals() toString() hashCode() finalize()
- 1 该方法是谁的
- 2 是什么方法(成员还是静态)
- 3 方法功能是什么,入参和出参是什么(能实现什么事,我需要给它什么,它需要给我什么)
- 4 什么时候可以重写(满足不了我们需求的时候)
1.2 Equals
- 关于Object中的equals方法
-
public boolean equals(Object obj){
-
return (this == obj);
-
}
- == : 两边如果是基本类型,则比较值的大小,但是两边如果是引用类型,则比较内存地址
- 而Object中的equals方法,默认比较 内存地址,因为 就是 ==
- 设计目的 : 比较两个对象是否相等
-
但是 它没有实现该功能,因为不知道怎么实现,不知道你要比较什么属性,所以没法实现
-
需要根据自己的需求进行重写,因为使用者一定知道怎么判断相等
- 两个对象可以是任何东西,但是我们肯定要拿两个对象的有意义属性进行比较
- 而不是比较内存地址,所以 这个时候要将两个对象对应的equals方法进行重写,以满足我们的需求
- 但是不同类的对象,没有可比性
覆写的三步 主要修改强制转换这里
- 比较字符串是否相等
-
应该用 equals 因为 == 比较内存地址
-
并且 String类中 已经重写了equals方法,比较的是值,而不是地址
- 任何的引用类型比较,都必须转换为基本类型比较,除非就是想知道他们内存地址是否一致
- 因为 == , != 这些 只能比较基本数据类型,当两个对象比较的时候,会比较内存地址
- 而我们比较的时候应该拿某一个相同的属性的值去比较,所以这样最终还是会变成基本数据类型
- 所以说,面向对象就是一种基本数据封装的形式,所以我们比较的时候最终都要转换为基本类型比较
1.3 toString
- toString :
- 设计目的 : 返回该对象的字符串表示形式,可以通过这个方法,把每个对象的数据展示出来,让外界知道
- 输出一个引用类型的时候,会自动调用该对象的toString方法
- Object中的toString
- public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
1.4 hashCode
- hashCode设计目的 : 是为了给每个对象生成一个唯一的标识符
- 同一个对象生成多次hash值,值一定是一样的
- 但是 不同对象,生成的值,也有可能相同,这样又叫哈希冲突
- 既然有哈希冲突的情况,所以 hash就不能保证数据的唯一性 , 怎么办?
-
1 先比较哈希,如果哈希不同,对象则不同
-
2 如果哈希值相同,再比较对象是否相同(equals)
- 覆写hashCode的时候,还需要考虑什么? equals
- 覆写equals的时候,还需要考虑什么? hashCode
- 因为 在java中 可以通过 hashCode和equals来表示对象的唯一性
- hash算法 : 是一种安全的加密算法,把不定长的值,改为定长的值,并且不能保证其唯一性
1.5 Finalize
- finalize 方法 功能
-
垃圾被回收之前 自动调用该方法,想做什么,自己覆写 Object
- 1 finalize是每个对都有的方法
- 2 不需要程序员去调用,由系统自动调用
- 3 java中如果每个更多引用指向这个对象,那么该对象被视为垃圾数据,等待被回收,被回收之前,自动调用finalize方法
- 4 finalize方法 没有垃圾回收功能,只是用于被回收之前做的一些事而已,回收是JVM去做的,所以程序员就算手动调用这个方法,也只是一个普通的成员方法调用而已,和对象回收没有任何关系
- 5 一般用于做一些对象回收前的数据销毁操作
- 类关系
参考类与类之间的关系文档 - 内部类
3.1 概述
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内 部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使 用内部类
在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者 称为外部类。
Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完 整的名称
3.2 分类
Static成员内部类
非static成员内部类
局部内部类
匿名内部类
3.3 成员内部类
- 变量 :
-
成员变量 : 成员内部类
-
静态变量 : 静态内部类
-
局部变量 : 局部内部类
-
形参和实参变量 : 匿名内部类
- 成员内部类 :
-
1 可以等同看做成员变量
-
2 成员内部类中不能有静态声明
-
3 成员内部类中可以直接访问外部类所有的属性
3.4 静态内部类
- 静态内部类
-
1 可以看做静态变量
-
2 静态内部类中,不能直接访问成员数据,需要有对象才行
-
3 静态内部类中可以声明所有东西
今天我们只讲解 : equals() toString() hashCode() finalize()
- 1 该方法是谁的
- 2 是什么方法(成员还是静态)
- 3 方法功能是什么,入参和出参是什么(能实现什么事,我需要给它什么,它需要给我什么)
- 4 什么时候可以重写(满足不了我们需求的时候)
1.2 Equals
- 关于Object中的equals方法
-
public boolean equals(Object obj){
-
return (this == obj);
-
}
- == : 两边如果是基本类型,则比较值的大小,但是两边如果是引用类型,则比较内存地址
- 而Object中的equals方法,默认比较 内存地址,因为 就是 ==
- 设计目的 : 比较两个对象是否相等
-
但是 它没有实现该功能,因为不知道怎么实现,不知道你要比较什么属性,所以没法实现
-
需要根据自己的需求进行重写,因为使用者一定知道怎么判断相等
- 两个对象可以是任何东西,但是我们肯定要拿两个对象的有意义属性进行比较
- 而不是比较内存地址,所以 这个时候要将两个对象对应的equals方法进行重写,以满足我们的需求
- 但是不同类的对象,没有可比性
覆写的三步 主要修改强制转换这里
- 比较字符串是否相等
-
应该用 equals 因为 == 比较内存地址
-
并且 String类中 已经重写了equals方法,比较的是值,而不是地址
*
- 任何的引用类型比较,都必须转换为基本类型比较,除非就是想知道他们内存地址是否一致
- 因为 == , != 这些 只能比较基本数据类型,当两个对象比较的时候,会比较内存地址
- 而我们比较的时候应该拿某一个相同的属性的值去比较,所以这样最终还是会变成基本数据类型
- 所以说,面向对象就是一种基本数据封装的形式,所以我们比较的时候最终都要转换为基本类型比较
1.3 toString
- toString :
- 设计目的 : 返回该对象的字符串表示形式,可以通过这个方法,把每个对象的数据展示出来,让外界知道
- 输出一个引用类型的时候,会自动调用该对象的toString方法
- Object中的toString
- public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
1.4 hashCode
- hashCode设计目的 : 是为了给每个对象生成一个唯一的标识符
- 同一个对象生成多次hash值,值一定是一样的
- 但是 不同对象,生成的值,也有可能相同,这样又叫哈希冲突
- 既然有哈希冲突的情况,所以 hash就不能保证数据的唯一性 , 怎么办?
-
1 先比较哈希,如果哈希不同,对象则不同
-
2 如果哈希值相同,再比较对象是否相同(equals)
- 覆写hashCode的时候,还需要考虑什么? equals
- 覆写equals的时候,还需要考虑什么? hashCode
- 因为 在java中 可以通过 hashCode和equals来表示对象的唯一性
- hash算法 : 是一种安全的加密算法,把不定长的值,改为定长的值,并且不能保证其唯一性
1.5 Finalize
- finalize 方法 功能
-
垃圾被回收之前 自动调用该方法,想做什么,自己覆写 Object
- 1 finalize是每个对都有的方法
- 2 不需要程序员去调用,由系统自动调用
- 3 java中如果每个更多引用指向这个对象,那么该对象被视为垃圾数据,等待被回收,被回收之前,自动调用finalize方法
- 4 finalize方法 没有垃圾回收功能,只是用于被回收之前做的一些事而已,回收是JVM去做的,所以程序员就算手动调用这个方法,也只是一个普通的成员方法调用而已,和对象回收没有任何关系
- 5 一般用于做一些对象回收前的数据销毁操作
- 类关系
参考类与类之间的关系文档 - 内部类
3.1 概述
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内 部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使 用内部类
在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者 称为外部类。
Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完 整的名称
3.2 分类
Static成员内部类
非static成员内部类
局部内部类
匿名内部类
3.3 成员内部类
- 变量 :
-
成员变量 : 成员内部类
-
静态变量 : 静态内部类
-
局部变量 : 局部内部类
-
形参和实参变量 : 匿名内部类
- 成员内部类 :
-
1 可以等同看做成员变量
-
2 成员内部类中不能有静态声明
-
3 成员内部类中可以直接访问外部类所有的属性
3.4 静态内部类
- 静态内部类
-
1 可以看做静态变量
-
2 静态内部类中,不能直接访问成员数据,需要有对象才行
-
3 静态内部类中可以声明所有东西