object概述
- 该类是层次结构的根类
- 每一个类直接或间接继承该类
- 所以的列,包括数组都实现这个类中的方法
- 任何一个类都会访问object类的无参构造方法
一但访问到父类的object构造方法,就会将object加载到内存空间中,就会执行object类的静态代码块 - 满足java的核心思想,万事万物皆对象
int hashCode ()(重点掌握)
由object类定义的hashcode方法确定会针对同的对象返回不同的整数
特点:
- 该值可以理解为地址值的一个转换值,该值相同不能说明两个对象相等,但是可以作为参考,该值不相等那么两个对象不一样
- 该值是对象的哈希码值
关于==比较基本数据类型和引用类型
比较基本类型:比较的是数值是否相等
比较引用类型:比较的是地址值是否相等
Class getClass()
返回的是一个字节码文件对象
任何一个类的编译会生成字节码文件对象
student.java–>student.class
这个student.class文件就class类
java万事万物皆对象,那么我们就可以理解为这个class文件在代码中就是class类
String tostring()(重点掌握)
观察tostring的源码
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(this.hashCode());
}
默认输出语句输出对象的时候输出的是对象的tostring方法
观察tostring源码发现来自于object的tostring方法打印类名全路径+地址值的转换值的十六进制
对我们毫无意义,object类的tostring方法不能够满足字了student的需求,所以需要方法重写
如何重写?
一般希望打印对象的成员属性值
可以自动生成
Alt+shift+s再按S
boolean equals(Object obj) (重点掌握)
public class ObjectDemo05 {
public static void main(String[] args) {
Student s1 = new Student("貂蝉", 18);
Student s2 = new Student("吕布", 19);
Student s3 = new Student("貂蝉", 18);
System.out.println(s1.equals(s2)); // false
System.out.println(s1.equals(s1)); // false
// String str1 = "abc";
// String str2 = "acd";
// String str3 = "abc";
//
// System.out.println(str1.equals(str2)); // false
// System.out.println(str1.equals(str3)); // true
//
// System.out.println(str1.equals(str1));
//
// System.out.println(str1.equals(new Student()));
}
}
观察equals源码:
s1.equals(s2)
public boolean equals(Object obj) {
// s1 == s3
return (this == obj);
}
再来观察String类equals方法
String str1 = "abc"; [a,b,c]
String str2 = "abd";
class String {
private final char value[];
public boolean equals(Object anObject) {
// 效率考虑
if (this == anObject) {
return true;
}
// 安全性考虑
if (anObject instanceof String) {
"abd"
String anotherString = (String)anObject;
int n = this.value.length; // 3
// 效率考虑
if (n == anotherString.value.length) {
char[] v1 = this.value; // 地址传递 [a,b,c]
char[] v2 = anotherString.value; [a,b,c]
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
}
通过观察string和object方法我们知道一般比较成员变量是否相等
这个一般自动生成
alt + shift + s 再按H
protected Object clone() (了解)
克隆:深拷贝和浅拷贝(查资料了解)
java.lang.CloneNotSupportedException
CloneNotSupportedException:需要被clone的类没有实现接口
解决办法:实现cloneable接口
cloneable:该接口没有任何的抽象方法,这样的接口称为标记接口
该接口是否实现本身就是一种功能的体现
clone的内存分析
克隆和引用传递的区别
克隆是原空间中独立出来的一份
地址传递是多个引用指向同一堆区空间
protected void finalize()
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法
public class ObjectDemo07 {
public static void main(String[] args) throws Throwable {
Student s = new Student();
s = new Student();
// s.finalize();
// 如果你希望自己来回收垃圾对象,按照如下步骤
// 1.启动垃圾回收期
System.gc();
// 2.调用系统运行垃圾回收期的回收方法
System.runFinalization();
}
}