目录
Object 类:
- 所有的类都 直接 或者 间接 的 继承自Object类,换言之,Object类是所有Java类的根基父类(包括 数组 和 接口的 实现类 和 抽象类)。
- 也就说明每个Java类 都拥有 Object的所有 可访问的 属性和方法。
- 如果在 类的声明中 未使用 extends 关键字指明其父类,那么 会 默认隐式的 继承自Object 类。相当于 javac.exe 编译器 在编译的时候 会默认在 类的声明后面 加上 extends Object。
Object中子类经常重写的几个方法:
-
toString()方法:
- Object 源码:
- API 释义:
- 如果只是输出或者拼接对象引用时 默认都会调用toString方法:
- 一般希望看到是对象的具体的属性的内容,而不是对象的地址,那么这时候就需要重写toString方法:
@Override public String toString() { return "People{" + "name='" + name + '\'' + ", age=" + age + ", sex=" + sex + ", hobby='" + hobby + '\'' + '}'; }
-
equals()方法:
-
== 和 equals() 的区别:
- == 是一个比较运算符
- == : 既可以比较基本类型,也可以比较引用类型。
- == :如果比较的基本类型,比较的是具体的值是否相等。
- == :如果比较的引用类型,比较的是地址值是否相等,就是比较是不是同一个对象。
- equals() 方法:
- 是Object类的一个实例方法,只能判断引用类型。
- Object类默认判断是 对象与对象之间的地址值是否相等 ,,子类往往都会重写该方法,用于判断具体的内容是否相等。比如 Stirng类、Integer类
- == 是一个比较运算符
-
-
String类 重写后的equals() 方法解读:
public boolean equals(Object anObject) { // 传入进来要比较 的字符串对象 和 被当前被比较的字符对象是否为同一个对象 if (this == anObject) { return true; } // 传入进来的要比较的字符串对象 是否为 String 类型 if (anObject instanceof String) { // 向下转型 至 String String anotherString = (String)anObject; // 被比较的字符串的长度 int n = value.length; // 要比较的字符串长度 和被比较的字符串长度 是否一致 if (n == anotherString.value.length) { // 被比较的字符串 隐式调用 toCharArray 方法转成char 数组 char v1[] = value; // 要比较的字符串 隐式调用 toCharArray 方法转成char 数组 char v2[] = anotherString.value; int i = 0; // 如果 要比较的字符串的长度不为0 while (n-- != 0) { // v1数组每个索引上的字符对应 v2每个索引上的字符进行比较 if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
-
People类 重写equals方法:
@Override public boolean equals(Object o) { // 要比较和被比较的 对象是同一个 if (this == o) return true; // 如果 要比较的对象为 null 或者 被比较与要比较的类型不一致。 if (o == null || getClass() != o.getClass()) return false; // 向下转型 People people = (People) o; return age == people.age && sex == people.sex && // 要比较的属性 与被比较的属性相同 或者 要比较的属性不等于空 且 被比较的属性的地址值完全一样。 Objects.equals(name, people.name) && Objects.equals(hobby, people.hobby); }
-
hashCode()方法:
- 源码:是个本地方法:
-
API释义:
- hashCode()方法:提高具有哈希结构的容器的效率。
- 两个引用,如果指向的是同一个对象,哈希值肯定是一样的。
- 两个引用,如果指定的是不同对象,(在不是很大的范围内。)哈希值是不一样的
- 哈希值主要根据对应的内存地址值来的。不能完全将哈希值等价于地址值。
- 如果是在集合 中 hashCode 如果有需要的话。也会重写。
-
finalize()方法:
- finalize是一个空方法,没有方法体。(基本不会重写,有的面试官 可能会问。)
- 作用:对象被GC回收时,JVM将会自动调用该对象的finalize方法,子类可以重写该方法。做一些释放资源的操作,比如:释放数据库连接等 ……。
- 什么时候回收:当某个对象没有任何引用是,JVM就会认为这个对象是一个垃圾对象。在JVM有空的时候会使用GC机制销毁该对象。在销毁对象前。会先调用finalize方法。
- GC机制的调用,有JVM决定,也可以通过System.gc() 主动触发GC机制。
- 代码比如:
public class PolymorphicTest { public static void main(String[] args) { FinalizeTest test = new FinalizeTest("JVM invoke finalize Method"); test = null; // 主动触发GC System.gc(); } } class FinalizeTest { private String name; public FinalizeTest(String name) { this.name = name; } @Override protected void finalize() throws Throwable { System.out.println("this = " + this + ",不再引用,触发GC机制被销毁"); System.out.println("this.name = " + this.name + ", JVM 调用finalize方法"); } }
test:
- finalize是一个空方法,没有方法体。(基本不会重写,有的面试官 可能会问。)
Objects类:
说明:Objects类 依然是 Object 类的子类 。Objects类是从JDK1.7版本后才开始有的。
-
Objects类的常用API:
- ,比较两个对象,源码有效的避免了空指针异常。更安全。
- ,用于比较数组,二维数组 ,对象。
- ,……
- 其他方法