1. 程式人生 > 實用技巧 >JavaSE學習筆記 - Java基礎語法

JavaSE學習筆記 - Java基礎語法

Java語言特性

  • 簡單性:Java 中真正操作記憶體的是 Java 虛擬機器,Java 虛擬機器通過執行 Java 程式來操作記憶體,而 C++ 都是通過指標來操作記憶體,Java 程式中不能直接操作指標,所以在 Java 中不容易導致記憶體洩漏,所以變得簡單。
  • Java 是完全面向的物件的語言:萬物皆物件
  • 健壯性:Java 編譯器能夠檢測許多在其他語言中僅僅在執行時檢測出來的問題。Java 有自動垃圾回收回收機制( GC 機制),不容易導致記憶體洩漏。
  • 支援多執行緒
  • 可移植性:編寫的 Java 程式,可以在不同的平臺執行。

Java虛擬機器 - JVM

  • 虛擬機器是一種抽象化的計算機,通過在實際的計算機上模擬模擬各種計算機功能來實現的。我們所編寫的 Java 程式,都是在 JVM 上執行的。
  • 我們用 Java 編寫的程式可以在任何的作業系統上面執行,這就是 Java 的跨平臺,Java 編寫的程式是在 JVM 上執行的,而 JVM 是執行在作業系統之上。

JDK、JRE

  • JRE:Java 程式的執行環境,其包含了 JVM (如果執行要跑一個 Java 程式,不需要開發的話,就是安裝一個可以執行程式的環境即可)
  • JDK:Java 程式的開發工具包,包含 JVM 和 JRE (如果程式開發者需要開發 Java 程式,那麼必然也會執行 Java 程式來進行測試。)

資料型別

基本資料型別 8個

  • 整型:byte(1位元組)  short(2位元組)  int(4位元組)  long(8位元組,字尾L)
  • 浮點型:float(字尾F)   double
  • 字元型:char(2位元組),中文使用Unicode編碼(0-65535)
  • 布林型:boolean(1位元組)
  • char 和 short 都是兩個位元組,但是 char 表示的文字,文字沒有正負的區別,所以 char 表示的數字更大。

計算機的儲存單位

  • 1位元組 = 8bit(8位元)-> 1byte = 8bit
  • 1KB = 1024byte
  • 1MB = 1024KB
  • 1GB = 1024MB
  • 1TB = 1024GB

引用資料型別

  • 陣列[]
  • 類 class(抽象類)
  • 介面 intergace
  • 列舉 enum
  • 註解 @interface

除了基本型別以外,剩下的都是引用資料型別。

常量與變數

  • 常量:程式執行過程中,不能再次改變的值。固定的值,代表計算過程中經常用到的值,便於程式計算。(常量儘量使用大寫)

常量分類

  • 字串常量:"111"
  • 整型常量:111
  • 浮點數常量:1.11
  • 字元常量:'我'
  • 布林常量:true、false
  • 空常量:null

  • 變數:程式執行的過程中,不能修改,變數指的是記憶體空間,變數空間在建立的時候,必須指定資料型別,變數空間的名字,必須用賦值語句對變數進行顯示初始化。變數是記憶體中最基本的儲存單元。

變數賦值記憶體分析

注意事項

  • 建立多個變數時,變數之間的名稱不可重複
  • float 和 long 型別需要新增字尾 F 和 L
  • 沒有賦值的變數不能直接使用

型別轉換

  • 除了 boolean 型別不能轉換以外其他的其中都可以進行型別轉換
  • 自動型別轉換:資料範圍從小到大
  • 強制型別轉換:資料範圍從大到小,編寫的時候需要新增 "強制型別",在型別轉換的過程中,可能發生精度損失或者資料溢位
  • byte,short,char 型別的資料在進行混合運算的時候,都會將資料轉換為 int 型別,然後在進行運算。(編譯器的優化)

運算子

按照運算元來分類

  • 單目、雙目、三目
  • 三目運算子:布林表示式 :?表示式1 :表示式2

按照運算子的功能來進行分類

  • 算術運算:+   -   ×   ÷   ++   --
      + 對於整型來說,直接進行運算,對於 char 來說,在計算之間計算機將 char 轉換成 int,然後進行運算,對於字串來說表示字串的連線。
      int y=x++,只有變數可以進行自增自減的運算,常量不能進行自增自減的運算,++ 在後,先賦值後計算。記憶體分析:在進行計算的時候,記憶體中有一個變數為 x 的空間和一個 y 的空間,進行計算的時候,先開闢一個臨時的記憶體空間,++ 在後的時候我們先把 x 的值備份到這個臨時空間內,然後對 x 進行自增的操作,最後將臨時空間內的值賦值給 y。如果 ++ 在前的時候,就對 x 先進行自增的操作,然後將 x 備份到臨時的記憶體空間中,最後將臨時空間中的內容賦值給 y。
  • 賦值運算:將 = 右邊的內容(值 引用)存入=左邊的變數空間內   +=   -=   *=   /=   %=
      byte、char、short 在參與運算的時候都會自動轉換成 int 型別,但是在使用 byte += 的時候不會變成 int 型別,因為 += 是一個符號會進行自動型別轉換。
  • 關係運算:>   >=   <  <=   !=   ==  物件 instanceof 類
  • 邏輯運算:&  |   ^  !   &&   ||
  • 位bit運算:&  |   ^  ~  <<   >>   >>>(按位右位移,無符號)
      正數的原碼,反碼,補碼相同,負數:反碼符號不動,其餘取反,補碼 = 反碼 + 1,計算機中不管是整數還是負數,儲存形式都是以補碼的形式來儲存。反碼是資料儲存的一種方式,而取反是一個計算過程(每一個位置都取反)

&和&&的區別
  & 可以是邏輯運算也可以是位運算,&& 只能是邏輯運算
  如果兩個符號是邏輯運算子的時候
    & 前後兩個條件都是 true,最終結果就是 true,正常情況下 & 執行結構是一致。
    當面前條件為 false 的時候後面的判斷語句就不會在執行了,最後結果為 false。

== 和 equals區別: 基本型別 == 比較的是值,引用型別比較的是地址,所以引用型別使用的是 equals 來對值進行比較,在引用型別中 equals 預設比較的也是地址,但是由於類中可以重寫 equals 方法,所以在引用型別進行值得比較的時候,需要重寫 equals 方法。

流程控制語句

Java陣列

  • 定義:陣列是用來儲存一組相同資料型別的資料的容器,將一組資料統一的管理起來。
  • 特點:陣列本身是一個引用資料型別;陣列可以儲存基本型別或者引用型別的元素;陣列是儲存在堆記憶體中的一串連續的地址;如果需要用變數來進行儲存,變數空間在棧記憶體中,變數中儲存的陣列引用(地址);陣列在初始化是必須指定長度以及內容儲存元素型別;陣列的長度一旦確定是不能再次發生改變。
陣列初始化
//動態初始化
int[] a = new int[100];
int[] a;
a = new int[100];
//靜態初始化
String[] strings = new String[] { "sss", "aaa", "ppp"};
String[] strings;
strings  = new String[] { "sss", "aaa", "ppp"};
//省略格式的初始化(不能進行拆分)
int[] a = {1, 2, 3};

陣列記憶體圖: new 出來的物件都儲存在堆區

Java記憶體劃分

  • 棧(Stack):存放方法中的區域性變數,方法的執行在棧中。
      區域性變數:方法的引數,方法內部的變數
      作用域:一旦變數超出作用域就會在棧記憶體中消失
  • 堆(Heap):只要是 new 出來的東西,都是在堆記憶體中的,儲存物件的例項,所有的物件的例項都在以及陣列都要在堆上分配。
      堆記憶體中的資料都有預設值
      堆記憶體中的東西都需要有一個 16 進位制的記憶體地址值
  • 方法區(Method Area):儲存 .class 檔案的相關資訊,方法等。儲存被虛擬機器載入的類資訊、常量、靜態邊浪、即時編譯後的程式碼等。
  • 本地方法棧(Native Method Stack):和作業系統相關
  • 暫存器:與CPU相關