javaSE_16_API文档概述丶Object 类
Posted wurengen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaSE_16_API文档概述丶Object 类相关的知识,希望对你有一定的参考价值。
API概述
API使用步骤
- 打开帮助文档。
- 点击显示,找到索引,看到输入框。
- 你要找谁?在输入框里输入,然后回车。
- 看包。java.lang下的类不需要导包,其他需要。
- 看类的解释和说明。
- 学习构造方法。
- 使用成员方法/变量。
Object类
java.lang.Object类是类层次结构的根(父)类。每个类(Person,Student...)都使用 Object 作为超(父)类。所有对象(包括数组)都实现这个类的方法。
public class MyClass /*extends Object*/ { // ... }
根据JDK源代码及Object类的API文档,Object类当中包含的方法有11个。
其中的常用的方法有:
toString方法:public String toString()
- 详解:toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。在我们直接使用输出语句输出对象名的时候,其实通过该对象调用了其toString()方法。toString()方法的设计目的是:通过调用这个方法可以将一个“java对象”转换成“字符串表示形式”。 注意:输出引用的时候,会自动调用该引用的toString()方法。
覆盖重写 :如果不希望使用toString方法的默认行为,则可以对它进行覆盖重写。在IntelliJ IDEA中,可以点击 Code 菜单中的 Generate... ,也可以使用快捷键 alt+insert ,点击 toString() 选 项。选择需要包含的成员变量并确定。举例:
public class Person { private String name; private int age; @Override public String toString() { return "Person{" + "name=‘" + name + ‘‘‘ + ", age=" + age + ‘}‘; } // 省略构造器与Getter Setter }
equals方法 :public boolean equals(Object obj) :指示其他某个对象是否与此对象“相等”。SUN公司设计equals方法的目的是什么?以后编程的过程当中,都要通过equals方法来判断两个对象是否相等。equals方法是判断两个对象是否相等的。调用成员方法equals并指定参数为另一个对象,则可以判断这两个对象是否是相同的。这里的“相同”有默认和自定义两种方式。
默认地址比较
- 如果没有覆盖重写equals方法,那么Object类中默认进行 == 运算符的对象地址比较,只要不是同一个对象,结果必然为false。
对象内容比较
- 如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以覆盖重写equals方法。
重写equals方法的场景:
- 不希望比较对象的地址值,想要结合对象属性进行比较的时候。
大多数IDE都可以自动生成equals方法的代码内容。在IntelliJ IDEA中,可以使用 Code 菜单中的 Generate… 选项,也可以使用快捷键 alt+insert ,并选择 equals() and hashCode() 进行自动代码生成。举例:
import java.util.Objects; public class Person { private String name; private int age; @Override public boolean equals(Object o) { // 如果对象地址一样,则认为相同 if (this == o) return true; // 如果参数为空,或者类型信息不一样,则认为不同 if (o == null || getClass() != o.getClass()) return false; // 转换为当前类型 Person person = (Person) o; // 要求基本类型相等,并且将引用类型交给java.util.Objects类的equals静态方法取用结果 return age == person.age && Objects.equals(name, person.name); } }
小结:
- java中基本数据类型比较是否相等,使用==
- java中所有的引用数据类型统一使用equals方法来判断是否相等。
- 自定义类,一定要重写equals方法。
finalize方法
垃圾回收器(Garbage Collection),也叫 GC,垃圾回收器主要有以下特点:
- 当对象不再被程序使用时,垃圾回收器将会将其回收
- 垃圾回收是在后台运行的,我们无法命令垃圾回收器马上回收资源,但是我们可以告诉他,尽快回收资源(System.gc 和 Runtime.getRuntime().gc())
- 垃圾回收器在回收某个对象的时候,首先会调用该对象的 finalize 方法
- GC 主要针对堆内存
- 单例模式的缺点
/* 关于Object类中的finalize()方法。 1、在Object类中的源代码: protected void finalize() throws Throwable { } GC:负责调用finalize()方法。 2、finalize()方法只有一个方法体,里面没有代码,而且这个方法是protected修饰的。 3、这个方法不需要程序员手动调用,JVM的垃圾回收器负责调用这个方法。 不像equals toString,equals和toString()方法是需要你写代码调用的。 finalize()只需要重写,重写完将来自动会有程序来调用。 4、finalize()方法的执行时机: 当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用 finalize()方法。 5、finalize()方法实际上是SUN公司为java程序员准备的一个时机,垃圾销毁时机。 如果希望在对象销毁时机执行一段代码的话,这段代码要写到finalize()方法当中。 6、静态代码块的作用是什么? static { .... } 静态代码块在类加载时刻执行,并且只执行一次。 这是一个SUN准备的类加载时机。 finalize()方法同样也是SUN为程序员准备的一个时机。 这个时机是垃圾回收时机。 7、提示: java中的垃圾回收器不是轻易启动的, 垃圾太少,或者时间没到,种种条件下, 有可能启动,也有可能不启动。 */ public class Test06{ public static void main(String[] args){ /* // 创建对象 Person p = new Person(); // 怎么把Person对象变成垃圾? p = null; */ // 多造点垃圾 for(int i = 0; i < 1000; i++){ Person p = new Person(); p = null; // 有一段代码可以建议垃圾回收器启动。 if(i % 2 == 0){ System.gc(); // 建议启动垃圾回收器。(只是建议,可能不启动,也可能启动。启动的概率高了一些。) } } } } // 项目开发中有这样的业务需求:所有对象在JVM中被释放的时候,请记录一下释放时间!!! // 记录对象被释放的时间点,这个负责记录的代码写到哪里? // 写到finalize()方法中。 class Person{ // 重写finalize()方法 // Person类型的对象被垃圾回收器回收的时候,垃圾回收器负责调用:p.finalize(); protected void finalize() throws Throwable { // this代表当前对象 System.out.println(this + "即将被销毁!"); } }
hashCode方法:public native int hashCode(); 这个方法不是抽象方法,带有native关键字,底层调用C++程序。hashCode()方法返回的是哈希码:实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值。所以hashCode()方法的执行结果可以等同看做一个java对象的内存地址。
public class Test07{ public static void main(String[] args){ Object o = new Object(); int hashCodeValue = o.hashCode(); // 对象内存地址经过哈希算法转换的一个数字。可以等同看做内存地址。 System.out.println(hashCodeValue); //798154996 MyClass mc = new MyClass(); int hashCodeValue2 = mc.hashCode(); System.out.println(hashCodeValue2); //1392838282 MyClass mc2 = new MyClass(); System.out.println(mc2.hashCode()); // 523429237 } } class MyClass { }
以上是关于javaSE_16_API文档概述丶Object 类的主要内容,如果未能解决你的问题,请参考以下文章