Java基礎篇之基礎知識(三)

1

有興趣可關注微信公衆號:Java成長錄

微信公衆號持續更新------------部分會在csdn同步

1.引用類型變量

Java語言有了垃圾回收機制,就不需要開發人員去控制內存回收,簡單點來說就是當一個變量沒有被引用指向時,垃圾回收機制就會回收(Java虛擬機的具體章節會在後面Java基礎篇之Java虛擬機)

基本類型的值就是數值,字符,或者布爾值;

int a = 1;

分配a內存的同時,並存儲a的值

引用類型的值是對象的引用,也就是對象內存裏面的地址,通過引用裏面存的對象地址去操作對象

T t = new T();

T t   :開闢引用空間

new T() :  開闢數據空間

T t = new T()  :賦值操作

引用類型變量的聲明和使用總結

  (1)把類名當作是一種類型來聲明變量,這種變量叫引用類型變量。

如:People people;

  (2)引用類型變量保存對象的“引用”,即對象的地址。

  (3)對象的創建  new 類名()  如:new People();

  (4)new創建對象後返回對象的引用,對象沒有名字,只能使用對象的引用間接使用對象,引用類型變量就是專門用來保存對象引用的。

    如:People people = new People();

  (5)成員變量的默認值:數據型成員變量默認值爲0,boolean型成員變量默認值爲false,引用類型成員變量默認值爲null。

  (6)對象內存分配,對象是被保存在堆中的,對象沒有名字。

    對象中保存的是對象的成員變量。沒有引用類型變量保存對象的引用時,對象被認爲是垃圾,會被垃圾回收機制銷燬。

  (7)使用對象的引用來訪問對象的成員變量與成員方法,都是使用“.”。

    成員變量與成員方法統稱爲成員。

    創建對象後直接訪問成員,隨之對象就會被銷燬,這種對象稱之爲匿名對象。如:new People().name = "老王";

    創建對象後返回的引用被引用類型變量保存,使用“引用類型變量.成員”;如:People p1 = new People();  p1.name = "老王";

2.值傳遞&引用傳遞

Java語言到底是值傳遞還是引用傳遞?這個網上有很多說法,那麼就先理解什麼是值傳遞引用傳遞是什麼意思然後就會比較容易理解Java到底是值傳遞還是引用傳遞?

  • 值傳遞:

調用方法時候,將值複製給形參一份,然後方法中對於形參的操作不會影響到實參的值。

 

  • 引用傳遞:

調用方法時將地址傳給形參,方法執行過程會影響實際值。

 

@org.junit.Test    public void test3(){        Integer a = 3;        Integer b = 4;        String str1 = "aaaa";        String str2 = "bbbb";        Empolyee empolyee1 = new Empolyee();        empolyee1.setName("111");        change4(a,b,empolyee1,str1,str2);        System.out.println("a:"+a+"----b:"+b+"----empolyee1:"+empolyee1.getName()+"----str1:"+str1+"----str2:"+str2);    }    public void change4(Integer a , Integer b ,Empolyee empolyee,String str1 ,String str2 ){        a = 5;        b = 6;        empolyee.setName("222");        str1 = "cccc";        str2 = "dddd";    }

輸出結果:

a:3----b:4----empolyee1:222----str1:aaaa----str2:bbbb
  1. 基本數據類型傳值,對形參的修改不會影響實參;

  2. 引用類型傳對象引用的地址副本,形參和實參指向同一個內存地址(同一個對象),所以對參數的修改會影響到實際的對象。

  3. String, Integer, Double等immutable的類型特殊處理,可以理解爲傳值,最後的操作不會修改實參對象。

但是在Java語言中調用方法無論是傳遞給形參的是基本數據類型的【值拷貝】還是引用類型的【地址拷貝】,都是一種值的形式,所以纔會有Java語言都是值傳遞的說法。

3.Object方法

public native int hashCode()public boolean equals(Object obj)protected native Object clone() throws CloneNotSupportedExceptionpublic String toString()public final native Class<?> getClass()protected void finalize() throws Throwable {}public final native void notify()public final native void notifyAll()public final native void wait(long timeout) throws InterruptedExceptionpublic final void wait(long timeout, int nanos) throws InterruptedExceptionpublic final void wait() throws InterruptedException

1,equals()

equals()與"=="的區別:

Java基本類型而言:"=="就是比較兩個值是否相等,沒有用到equals()

包裝類型而言,"=="是判斷兩個引用對象是否同一個,equals()則比較對象是否相等

2,hashCode()

hashCode() 返回散列值,而 equals() 是用來判斷兩個對象是否等價。等價的兩個對象散列值一定相同,但是散列值相同的兩個對象不一定等價。

3,toString()

/*自定義的Empolyee類*/Empolyee empolyee1 = new Empolyee();System.out.println(empolyee1.toString());//Empolyee@677327b6

輸出結果:默認顯示的@後面是16進制散列碼

注意:equals()方法和hashCode()方法同時重寫

4.反射

Java反射說的是在運行狀態中,對於任何一個類,我們都能夠知道這個類有哪些方法和屬性。對於任何一個對象,我們都能夠對它的方法和屬性進行調用。把這種動態獲取對象信息和調用對象方法的功能稱之爲反射機制。

反射的優點:

  • 可擴展性 :應用程序可以利用全限定名創建可擴展對象的實例,來使用來自外部的用戶自定義類。

  • 類瀏覽器和可視化開發環境 :一個類瀏覽器需要可以枚舉類的成員。可視化開發環境(如 IDE)可以從利用反射中可用的類型信息中受益,以幫助程序員編寫正確的代碼。

  • 調試器和測試工具 :調試器需要能夠檢查一個類裏的私有成員。測試工具可以利用反射來自動地調用類裏定義的可被發現的 API 定義,以確保一組測試中有較高的代碼覆蓋率。

反射的缺點:

儘管反射非常強大,但也不能濫用。如果一個功能可以不用反射完成,那麼最好就不用。在我們使用反射技術時,下面幾條內容應該牢記於心。

  • 性能開銷 :反射涉及了動態類型的解析,所以 JVM 無法對這些代碼進行優化。因此,反射操作的效率要比那些非反射操作低得多。我們應該避免在經常被執行的代碼或對性能要求很高的程序中使用反射。

  • 安全限制 :使用反射技術要求程序必須在一個沒有安全限制的環境中運行。如果一個程序必須在有安全限制的環境中運行,如 Applet,那麼這就是個問題了。

  • 內部暴露 :由於反射允許代碼執行一些在正常情況下不被允許的操作(比如訪問私有的屬性和方法),所以使用反射可能會導致意料之外的副作用,這可能導致代碼功能失調並破壞可移植性。反射代碼破壞了抽象性,因此當平臺發生改變的時候,代碼的行爲就有可能也隨着變化。

5.異常

Throwable 可以用來表示任何可以作爲異常拋出的類,分爲兩種: Error 和 Exception。其中 Error 用來表示 JVM 無法處理的錯誤,Exception 分爲兩種:

  • 受檢異常 :需要用 try...catch... 語句捕獲並進行處理,並且可以從異常中恢復;

  • 非受檢異常 :程序運行時錯誤,例如除 0 會引發 Arithmetic Exception,此時程序崩潰並且無法恢復。

1

有興趣可關注微信公衆號:Java成長錄

微信公衆號持續更新------------部分會在csdn同步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章