JavaSE學習筆記 - Java基礎語法
阿新 • • 發佈:2020-08-27
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相關