Java基礎教程:Java之Object類,Objects類,Date類概念及使用!

2020-12-11 黑馬程式設計師

Object類概述

java.lang.Object類是Java語言中的根類,即所有類的父類。它中描述的所有方法子類都可以使用。在對象實例化的時候,最終找的父類就是Object。

如果一個類沒有特別指定父類, 那麼默認則繼承自Object類。例如:

public class MyClass /*extends Object*/ {// ...}

根據JDK原始碼及Object類的API文檔,Object類當中包含的方法有11個。今天我們主要學習其中的2個:

public String toString():返回該對象的字符串表示。

public boolean equals(Object obj):指示其他某個對象是否與此對象「相等」。

toString方法

方法摘要

public String toString():返回該對象的字符串表示。

toString方法返回該對象的字符串表示,其實該字符串內容就是對象的類型+@+內存地址值。

由於toString方法返回的結果是內存地址,而在開發中,經常需要按照對象的屬性得到相應的字符串表現形式,因此也需要重寫它。

覆蓋重寫

如果不希望使用toString方法的默認行為,則可以對它進行覆蓋重寫。例如自定義的Person類:

public class Person { private String name; private int age; @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } // 省略構造器與Getter Setter}

在IntelliJ IDEA中,可以點擊Code菜單中的Generate...,也可以使用快捷alt+insert,點擊toString()選項。選擇需要包含的成員變量並確定。如下圖所示:

貼士: 在我們直接使用輸出語句輸出對象名的時候,其實通過該對象調用了其toString()方法。

equals方法

方法摘要

public boolean equals(Object obj):指示其他某個對象是否與此對象「相等」。

調用成員方法equals並指定參數為另一個對象,則可以判斷這兩個對象是否是相同的。這裡的「相同」有默認和自定義兩種方式。

默認地址比較

如果沒有覆蓋重寫equals方法,那麼Object類中默認進行==運算符的對象地址比較,只要不是同一個對象,結果必然為false。

對象內容比較

如果希望進行對象的內容比較,即所有或指定的部分成員變量相同就判定兩個對象相同,則可以覆蓋重寫equals方法。例如:

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); }}

這段代碼充分考慮了對象為空、類型一致等問題,但方法內容並不唯一。大多數IDE都可以自動生成equals方法的代碼內容。在IntelliJ IDEA中,可以使用Code菜單中的Generate…選項,也可以使用快捷鍵alt+insert,並選擇equals() and hashCode()進行自動代碼生成。如下圖所示:

tips:Object類當中的hashCode等其他方法,今後學習。

Objects類

Objects類是對象工具類,它裡面的的方法都是用來操作對象的。

equals方法

在剛才IDEA自動重寫equals代碼中,使用到了java.util.Objects類,那麼這個類是什麼呢?

JDK7添加了一個Objects工具類,它提供了一些方法來操作對象,它由一些靜態的實用方法組成,這些方法是null-save(空指針安全的)或null-tolerant(容忍空指針的),用於計算對象的hashcode、返回對象的字符串表示形式、比較兩個對象。

在比較兩個對象的時候,Object的equals方法容易拋出空指針異常,而Objects類中的equals方法就優化了這個問題。方法如下:

public static boolean equals(Object a, Object b):判斷兩個對象是否相等。

我們可以查看一下源碼,學習一下:

public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b));

isNull

static boolean isNull(Object obj) 判斷對象是否為null,如果為null返回true。

Student s1 = null;Student s2 = new Student("蔡徐坤", 22);// static boolean isNull(Object obj) 判斷對象是否為null,如果為null返回trueSystem.out.println(Objects.isNull(s1)); // trueSystem.out.println(Objects.isNull(s2)); // false

Date類

Date概述

java.util.Date`類 表示特定的瞬間,精確到毫秒。

繼續查閱Date類的描述,發現Date擁有多個構造函數,只是部分已經過時,我們重點看以下兩個構造函數

public Date():從運行程序的此時此刻到時間原點經歷的毫秒值,轉換成Date對象,分配Date對象並初始化此對象,以表示分配它的時間(精確到毫秒)。public Date(long date):將指定參數的毫秒值date,轉換成Date對象,分配Date對象並初始化此對象,以表示自從標準基準時間(稱為「曆元(epoch)」,即1970年1月1日00:00:00 GMT)以來的指定毫秒數。

tips: 由於中國處於東八區(GMT+08:00)是比世界協調時間/格林尼治時間(GMT)快8小時的時區,當格林尼治標準時間為0:00時,東八區的標準時間為08:00。

簡單來說:使用無參構造,可以自動設置當前系統時間的毫秒時刻;指定long類型的構造參數,可以自定義毫秒時刻。例如:

import java.util.Date;public class Demo01Date {public static void main(String[] args) { // 創建日期對象,把當前的時間 System.out.println(new Date()); // Tue Jan 16 14:37:35 CST 2020 // 創建日期對象,把當前的毫秒值轉成日期對象 System.out.println(new Date(0L)); // Thu Jan 01 08:00:00 CST 1970 }}

tips:在使用println方法時,會自動調用Date類中的toString方法。Date類對Object類中的toString方法進行了覆蓋重寫,所以結果為指定格式的字符串。

Date常用方法

Date類中的多數方法已經過時,常用的方法有:

public long getTime()把日期對象轉換成對應的時間毫秒值。public void setTime(long time)把方法參數給定的毫秒值設置給日期對象示例代碼

public class DateDemo02 {public static void main(String[] args) { //創建日期對象 Date d = new Date(); //public long getTime():獲取的是日期對象從1970年1月1日 00:00:00到現在的毫秒值 //System.out.println(d.getTime()); //System.out.println(d.getTime() * 1.0 / 1000 / 60 / 60 / 24 / 365 + "年"); //public void setTime(long time):設置時間,給的是毫秒值 //long time = 1000*60*60; long time = System.currentTimeMillis(); d.setTime(time); System.out.println(d); }}

小結:Date表示特定的時間瞬間,我們可以使用Date對象對時間進行操作。

相關焦點

  • Java資料庫類的原型
    我們是否可以創建一個資料庫連接類,該類允許我們僅更改配置文件,然後使用資料庫?我做了這個類的原型,這很簡單。但是這個主意很好,總是使用一個非常簡單的jar文件來獲取安裝資料庫,然後可以執行SQL查詢操作。
  • Java之 Scanner類
    Scanner 類java.util.Scanner 是 Java5 的新特徵,我們可以通過 Scanner 類來獲取用戶的輸入,並通過 Scanner 類的 next() 與 nextLine() 方法獲取輸入的字符串,在讀取前我們一般需要 使用 hasNext 與 hasNextLine 判斷是否還有輸入的數據。
  • java面試題總結:java的接口類和抽象類的特點
    java的接口類和抽象類的特點java中抽象類的特點:
  • Java基礎教程:java反射機制教程
    因為這個類是我們自己定義的,所以在使用的時候我們知道User有兩個欄位name和age,還有無參和有參構造方法,另外的test方法我們也可以直接調用(因為其是public)。 二、深入分析java反射機制 1、獲取Class類 在java中萬事萬物皆對象,Useruser=newUser()一行代碼我們知道了user是User類的實例對象,通過Studentstu=newStudent()我們知道了
  • 18 個 Java 8 日期處理的工具類
    Java處理日期、日曆和時間的方式一直為社區所詬病,將 java.util.Date設定為可變類型,以及SimpleDateFormat的非線程安全使其應用非常受限。新API基於ISO標準日曆系統,java.time包下的所有類都是不可變類型而且線程安全。
  • Java 8時間類,越用越香
    為什麼會在Jdk8中加入很多時間類非線程安全java.util.Date 是非線程安全的,所有的日期類都是可變的而java8中日期和時間基本都被設計final,final修飾的類,天然線程安全。設計很差java.util.Date同時包含日期和時間,而java.sql.Date僅包含日期,兩個類又有相同的名字,令人匪夷所思。
  • Java 8的Nashorn腳本引擎教程
    使用Nashorn Nashorn javascript 引擎要麼在java程序中以編程的方式使用要麼在命令行工具jjs使用,jjs在目錄$JAVA_HOME/bin中。 下面的java方法簡單列印實際的類方法參數的類型: static void fun2(Object object) {     System.out.println(object.getClass()); }  為了解引擎如何處理類型轉換,我使用不同JavaScript類型來調用java方法: MyJavaClass.fun2
  • Java之File類的構造方法
    Java之File類的簡單介紹,File類的靜態成員變量,這次小編要介紹的是File類的構造方法(f1);//重寫了Object類的toString方法,列印的是一個路徑:c:\Users\java\code\a.textFile f2=new File("c:\\Users\\java\\code");System.out.println(f2);
  • 跟我學java編程—Java的Scanner類
    Scanner scanner = new Scanner(System.in);示例1:Scanner類的初始化在D盤Java目錄下,新建「ScannerInitSample.java」文件。用記事本打開「ScannerInitSample.java」文件,輸入以下代碼:代碼結構分析程序功能主要是演示Scanner如何聲明及初始化。語句「import java.util.*;」,用於導入包含Scanner的類庫,Scanner包含在Java 核心類庫util中,要使用Scanner類,必須導入java.util庫,類庫導入關鍵字為import。
  • java並發編程-原子類
    而 java.util.concurrent.atomic 下的類,就是具有原子性的類,可以原子性地執行添加、遞增、遞減等操作。比如之前多線程下的線程不安全的 i++ 問題,到了原子類這裡,就可以用功能相同且線程安全的 getAndIncrement 方法來優雅地解決。
  • Java基礎知識中的類
    (2)方法:昌類的操作定義,標誌類的動態特徵,它的基本格式如下:訪問說明符 數據類型 方法名(數據類型1 變量名1,數據類型2 變量名2)其中:訪問說明符為public、private和protected,其使用方法與成員變量訪問說明符的使用方法一致。
  • 夯實Java基礎系列9:深入理解Class類和Object類
    在Java中,可以使用Future+Callable的方式做到這一點,具體做法可以參見我的這篇文章Java多線程21:多線程下其他組件之CyclicBarrier、Callable、Future和FutureTask。(3)回調1、什麼是回調?
  • 談談Java中的時間類
    如果想獲得現在時刻的「時刻數值」,可以使用:long now = System.currentTimeMillis();這個「時刻數值」是所有時間類的核心值,年月日都是根據這個「數值」計算出來的。我們工作學習涉及的時間相關類有如下這些:Date時間類(java.util.Date)在標準Java類庫中包含一個Date類。它的對象表示一個特定的瞬間,精確到毫秒。1.
  • MapStruct的使用,java實體類的轉換
    下面給大家推薦一款比較好用的插件,他可以用來完成實體類之間的轉換工作,並且可以自定義轉換方法-MapStruct。swagger,需要放到swagger的上面,不然運行會出錯普通用法:@Mapper(componentModel = "spring")// 方便通過註解的方式使用public interface AccessToOpenApiInfoMapper {/** 映射器的實例,可以通過這個調用相應的方法,這個可以不用要,是線程安全的可以安心使用*調用的例子代碼:*OpenApiInfo
  • java之Scanner類的簡單介紹
    Scanner是一個引用類型,接下來小編就簡單介紹引用類型通常情況下的使用步驟。第一步,導包格式:import 包路徑.類名稱;如果需要使用的目標類,和當前類位於同一個包下,則可以省略導包語句不寫。另外,只有java.lang包下的內容不需要導包,其他的包都需要import語句。
  • java類加載的過程概述
    加載:是將class文件讀入內存,並為之創建一個Class對象。任何類被使用時系統都會建立一個Class對象。2. 連接:(1)驗證是否有正確的內部結構,並和其他類協調一致。(2)準備負責為類的靜態成員分配內存,並設置默認初始化值。(3)解析將類的二進位數據中的符號引用替換為直接。
  • 【143期】Java 類是如何被加載的?
    2020年百日百更原創Java最全面試題庫之往期回顧不過貿然的向別人解釋雙親委派模型是不妥的,如果在不了解JVM的類加載機制的情況下,又如何能很好的理解「不同ClassLoader加載的類是互相隔離的」這句話呢?所以為了理解雙親委派,最好的方式,就是先了解下ClassLoader的加載流程。二:Java 類是如何被加載的2.1:何時加載類我們首先要清楚的是,Java類何時會被加載?
  • Java File類(文件操作類)詳解
    類來完成。File 類定義了一些方法來操作文件,如新建、刪除、重命名文件和目錄等。File 類不能訪問文件內容本身,如果需要訪問文件內容本身,則需要使用輸入/輸出流。File 類提供了如下三種形式構造方法。
  • 不簡單的 Java SimpleDateFormat
    在 Java 中格式化和解析日期的一種常見方法是使用 SimpleDateFormat。下面是我們用到的一個公共類。import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public final class DateUtils { public static final SimpleDateFormat SIMPLE_DATE_FORMAT
  • 8千字java反射乾貨|java反射精講
    java反射機制精講目錄1. 反射機制的概念2. 反射的基礎Class類3. 反射的用法4.反射的應用示例反射機制的概念:在運行狀態中,對於任意一個類,都能夠獲取到這個類的所有屬性和方法,對於任意一個對象,都能夠調用它的任意一個方法和屬性(包括私有的方法和屬性),這種動態獲取的信息以及動態調用對象的方法的功能就稱為java語言的反射機制。反射被視為動態語言的關鍵。簡單來說反射就是java的各種成分映射成對應的java類。