[java核心外篇]__Object類與對象類型的轉型


  • 前言
    我們在之前的學習中提過很多次了,java是面向對象的,java的基礎可以說是建立在類和對象上面的.然后我們又學到了類的繼承,發現了在java類庫中,類的繼承是極為普遍的,一個類繼承另一個類,就像是一個家族樹一樣蔓延開來,今天就說一下,這個樹的頂端,也就是一切類的開始,Object類.另外在學習下應繼承機制而導致對象的兩種特性.

  • Object類

Object類是JAVA語言一切類的開始,所有的類都直接或間接的繼承自它,當我們定義一個類時,如果不聲明繼承關系,那么它就默認的繼承Object類,因為它可以說是java語言一切類的父類,所以繼承它就是默認的情況,使得我們在定義類的時候並不用通過extends指明和它的繼承關系.但是我們又可以使用和重寫它的一些基本的方法.

  • Object類中主要包括clone(),finalze(),equals(),toString()等方法.其中equlas方法和toString方法經常會被我們用到,並且會碰到重寫toString方法的情況.

2019-4-11-09.gif

  • 我們在IdEA中通過定義兩個類,我們可以就可以發現這一現象,最后打開Object類看看,可以看到其構成十分簡單,只有少數基本的方法,雖然很多我們都沒有用過,或許也不知道其作用.

image.png

這里需要注意到的是,Object類中的方法並不是都能夠被重寫的,因為其中有getClass(),notify(),notifyAll(),wait()等方法是被inal修飾符修飾的.我們知道被final修飾的變量是常量,所以被final修飾的方法也是一個"常量"方法,其內容是不可變的,也就意味着不能夠被重寫.

  • 其中getClass方法會返回對象執行的class實例,然后使用該實例調用getName方法可以獲得類的名稱.

我們試試看:

通過其方法的說明,我們可以這樣使用它,打印出實例化對象所對應的類的類名.

System.out.println(sty_classfeature.getClass().getName());

image.png

  • toString方法,相比我們已經很熟悉了,它能夠將對象的內容作為字符串類型返回.所以我們通常使用該方法來進行對象的輸出.同時我們也可以對它進行重寫.

我們可以看看Object類中的toString方法:

  public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

發現我們只能看得懂前半段,知道會返回一個對象對應的類名,@后面的應該是一個Int型的數據.經過查找一番,知道了后半段的意義:

在Object類中定義toString()方法的時候返回對象的哈希code碼(對象地址字符串)

試試看:

// toString 方法
    System.out.println(sty_classfeature.toString());

image.png

現在我們知道了Object類的toString方法返回的值是這樣的結構了,但顯然,這和我們平時使用的toString方法不同啊,我們印象中的toString方法,應該是返回對象的一些屬性值的,可以做出輸出來使用的,是在哪里經常遇到的呢,看下面這段代碼:

public class sty_entity {
    private String name;
    private int age;
    private char sex;

    @Override
    public String toString() {
        return "sty_entity{" + "name='" + name + '\'' + ", age=" + age + ", sex=" + sex + '}';
    }
}

image.png

對的沒錯,就是在我們構建實體類時會使用到的toString方法,然而其實這里使用的就是重寫的toString方法,然后我們在其他類中實例化對象調用toString方法時,就可以返回將各屬性以String類型返回了.

  • 對象的類型轉換

對象的類型轉換在java編程中也會經常遇到,包括有向上轉型和向下轉型.

  • 向上轉型

向上轉型就是將子類的對象賦值個父類,成為父類的一個實例化對象,這個其實是十分好理解的,我們前面了解到繼承,知道了子類其實繼承了父類的屬性和行為,那么子類的對象自然也可以看做是一個(特殊的)父類的對象.就比如我們經常說的,正方形是一個特殊的平行四邊形.

我們可以來看看這個例子:

public class sty_Typeconversion {
    public void main(String[] args) {  //定義主方法
        square square = new square();  // 實例化正方形對象
        square.draw(square); // 調用父類方法,以子類對象作為父類對象傳參數,向上轉型.
    }
}
// 定義四邊形類
class quadrilateral{
   public void draw(quadrilateral q){
       System.out.println("繪制四邊形");
    }
}
// 定義子類正方形繼承四邊形類
class square extends quadrilateral {
}

這里的我們子類沒有重寫父類方法draw,直接調用父類方法,而其參數必須是一個父類類型的參數,這里就把子類類型的對象當做了父類類型的參數使用,就是向上轉型.

  • 向下轉型

向下轉型,就名字而言就明白了,它應該是和向上轉型相反,將父類的對象作為子類對象來使用,那么我們聯想繼承的特性,就知道,這樣做事有問題的,因為子類可以是父類的特例,子類可以有父類所沒有的屬性和行為.而這也是向下轉型的弊端,當子類具有獨特屬性和行為時,使用向下轉型就必然會導致他們的缺失.

   quadrilateral q = new square();  // 將子類對象賦值給父類類型對象.
    //  square s = q;  // 直接將父類對象轉換為子類對象是不行的,就像數據的類型轉換一樣,
        square s = (square) q;  // 只能通過強制類型轉換來向下轉型

我們可以發現對象的類型轉換,向上向下轉型,和數據類型的轉換有異曲同工之妙.向上轉型就相當於低精度轉向高精度,不會帶來任何隱患和問題,向下轉型就像低精度向高精度的轉換,會有屬性,行為的缺失.必須使用強制類型轉換才行,否則報錯.

  • 最后補充一點知識:
    我們可以通過instanceof關鍵字判斷一個對象是否是某個類的實例化對象,其兩個參數,object instenceof Exampleclass. 其返回值為boolean型.
System.out.println(s instanceof square);

更新時間:
2019-4-14
22:24


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM