javaSE_16_API文档概述丶Object 类

Posted wurengen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaSE_16_API文档概述丶Object 类相关的知识,希望对你有一定的参考价值。

API概述

API(Application Programming Interface),应用程序编程接口。Java API是一本程序员的 字典 ,是JDK中提供给我们使用的类的说明文档。这些类将底层的代码实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可。所以我们可以通过查询API的方式,来学习Java提供的类,并得知如何使用它们。

API使用步骤

  1. 打开帮助文档。
  2. 点击显示,找到索引,看到输入框。
  3. 你要找谁?在输入框里输入,然后回车。
  4. 看包。java.lang下的类不需要导包,其他需要。
  5. 看类的解释和说明。
  6. 学习构造方法。
  7. 使用成员方法/变量。

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 主要针对堆内存
  • 单例模式的缺点
当垃圾收集器将要收集某个垃圾对象时将会调用 finalize,建议不要使用此方法,因为此方法的运行时间不确定,如果执行此方法出现错误,程序不会报告,仍然继续运行
/*
    关于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 类的主要内容,如果未能解决你的问题,请参考以下文章

udp编程

JavaSE_03_Thread类02

01 变量与数据类型

JavaSE基础入门_019_Java8特性

JavaSE-常用API

现在的程序员真是越来越懒了,api 文档都懒得写!程序员:“api工具惯的”