天天看點

【Java核心知識一】基礎知識

相比C++,Java是一種更純粹的面向對象語言,在Java中,(幾乎)一切都是對象。

1.1 建立對象

通過辨別符操縱對象,操縱的辨別符是對象的引用(reference)。類似于遙控器(引用)操作空調(對象)。

  • 建立引用:
String s;
           
  • 對引用初始化:
String s = "hello java";
           
  • 通常用new操作符實作初始化:
String s = new String("hello java");
           

1.2 對象存儲在哪?

基本知識:計算機中有以下五個地方可以存資料

  • 寄存器:
    • 速度最快的存儲區。
    • 位于cpu内部,數量極其有限。
    • 寄存器會按需配置設定,你無法感覺。
  • 棧:
    • 速度非常快(僅次于寄存器)。
    • 位于RAM内部。
    • 通常存儲Java對象的引用。
  • 堆:
    • 通用的記憶體池,也位于RAM中。
    • 通常用于存儲Java對象。
    • 好處:編譯器無需知道存儲的資料在堆裡存儲了多久,是以配置設定存儲比較靈活。
  • 非RAM區:
    • 存活于程式之外,程式沒有運作時也可以存在。
    • 如:流對象和持久化對象。
    • 有時候(嵌入式系統中)常量可能會存儲到ROM區。

1.3 基本資料類型

基本資料類型需要被特殊對待。
  • 通過上文可知,一般情況下Java通過new将對象存放在堆裡。
  • 但是,用new建立一個特别小的,簡單的,常用的變量,放在堆裡就影響了程式的效率。
  • 是以,對于這些基本的類型,可以不用new來建立,而是建立一個并非引用的“自動”變量,這些變量直接存儲值,并存放在棧中。
  • 目的:提高程式的效率。

Java目前支援八種基本資料類型:

基本類型 大小 最小值 最大值 包裝類類型
Boolean Boolean
char 16-bit Unicode 0 Unicode 2^16-1 Character
byte 8 bits -128 127 Byte
short 16 bits -2^15 2^15-1 Short
int 32bits -2^31 2^31-1 Integer
long 64 bits -2^63 2^63-1 Long
float 32 bits IEEE754 IEEE754 Float
double 64 bits IEEE754 IEEE754 Double
void Void

注:

  • boolean所占大小沒有明确指定。參考:(1)Oracle官方文檔(2)你真的知道boolean類型大小嗎
  • byte即位元組。在java中,byte是作為最小的數字來處理的。

1.4 建立新的資料類型:類

  • 建立類:
class People {
    /* 類主體 */
}
           
  • 建立對象:
  • 字段,方法,參數(清單)和傳回值 略
  • static關鍵字:友善在沒有建立對象的情況下來進行調用(方法/變量)。
    • static修飾的方法 / 變量不需要依賴于對象來進行通路,隻要類被加載了,就可通過類名通路。
    • static方法(靜态方法)不依賴于任何對象就可以進行通路,是以對于靜态方法是沒有this的,因為它不依附于任何對象。是以,在靜态方法中不能通路類的非靜态成員變量和非靜态成員方法,因為非靜态成員方法/變量都是必須依賴具體的對象才能夠被調用。
    • static變量(靜态變量)與非靜态變量的差別:靜态變量被所有的對象所共享,在記憶體中隻有一個副本,它當且僅當在類初次加載時會被初始化;非靜态變量是對象所擁有的,在建立對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響。
    • static代碼塊。static塊可以置于類中的任何地方,類中可以有多個static塊。在類初次被加載的時候,會按照static塊的順序來執行每個static塊,并且隻會執行一次。

1.5 操作符

  • 注意優先級。
  • 簡化符号:

    x = x + 1;

    可以寫為

    x += 1;

  • 自動遞增遞減:

    print(i++)

    print(++i)

    • ++在前,先自增再指派;
    • ++在後,先指派再自增。
  • 關系操作符:
    • 基本資料類型的比較,使用

      ==

      ;
    • 引用類型的比較,使用

      equals()

  • 按位操作符:
    • &

      ,或

      |

      ,取反

      ~

      ,異或

      ^

  • 移位操作符:
    • 左移:

      <<

    • 有符号右移

      >>

      , 符号為正,高位插0,符号為負,高位插1
    • 無符号右移

      >>>

      ,無論正負,高位插0

1.6 控制程式執行流程

  • if-else, while, do-while, for, foreach

  • return:
    • 指定方法傳回什麼
    • 導緻目前方法退出,并傳回那個值
  • break和continue:
    • break表示退出目前循環,并且不執行循環剩下的所有語句(包括接下來所有未執行的循環)
    • continue表示退出目前循環,但是傳回循環起始處執行下一次循環(如果存在)

1.7 初始化和清理

  • 構造器
    • 名稱與類同名(意味着首字母大寫)
    • 建立對象時

      new People()

      ,先為對象配置設定存儲空間,再調用構造器。=>確定了你在操作對象前,它就已經被初始化了
    • 構造器的重載(同名,但是參數清單不一樣)
  • 對于有繼承關系的子父類程式的初始化順序:
    • 1.父類【靜态成員】和【靜态代碼塊】,按在代碼中出現的順序依次執行。
    • 2.子類【靜态成員】和【靜态代碼塊】,按在代碼中出現的順序依次執行。
    • 3.父類的【普通成員變量被普通成員方法指派】和【普通代碼塊】,按在代碼中出現的順序依次執行。
    • 4.執行父類的構造方法。
    • 5.子類的【普通成員變量被普通成員方法指派】和【普通代碼塊】,按在代碼中出現的順序依次執行。
    • 6.執行子類的構造方法。
  • this關鍵字
    • 隻能在方法内部使用,表示“調用該方法的那個對象”的引用
    • 應用場景:需要明确指出目前對象的引用
      public class Money {
          int i = ;
          Money increment() {
              i++;
              return this; // 傳回Moeny對象的引用
          }
          void print() { Systemn.out.println("i = " + i); }
          public static void main(String[] args) {
              Money m = new Money();
              m.increment().increment().increment().print();
          }
      }
                 
    • 将目前對象傳遞給其他方法也很有用
  • finalize()方法:
    • finalize()是Object的protected方法,子類可以覆寫該方法以實作資源清理工作,GC在回收對象之前調用該方法。
    • 一般不建議用finalize()完成“非記憶體資源”的清理工作,但建議用于:
      • ① 清理本地對象(通過JNI建立的對象);
      • ② 作為確定某些非記憶體資源(如Socket、檔案等)釋放的一個補充:在finalize方法中顯式調用其他資源釋放方法。