變量
變量和常量是程序處理的兩種基本數據對象,變量是程序的基本組成單位
變量的目的就是確定目標並提供存放空間
public class Hello { public static void main(String args[]) { int a=10; //定義一個變量,並賦值 int b=20; int result=a+b; //變量之間的運算 System.out.println("結果是"+result); } }
運行結果:
D:\myJavaDemo>javac -encoding UTF-8 Hello.java D:\myJavaDemo>java Hello 結果是30
基本數據類型
補碼
程序在運行的時候都是用補碼運行的,同樣計算出的結果也是補碼,
- 0的原碼和補碼都是0,
- 正數的補碼是其本身的二進制形式,
- 負數的補碼需要先將其絕對值按位取反(取得的結果叫做反碼),再 +1。
比如 - 3 ,就是先將 1000 0011 按位取反(除了符號位),得到 1111 1100 ,在 +1 得到 1111 1101
java有四大基本數據類型:整數類型,浮點類型,布爾類型,字符類型
整數類型
整數類型可以表示一個整數,常用的整數類型有:byte,short,int,long
計算機中的信息存儲單位:
-
- 最小是bit,也就是位——表示0/1
- 1 字節(Byte / B) == 8 位(bit)
- 1 KB == 1024字節(B) == 2^10B
- 1 MB == 1024KB == 1024 * 1024字節 == 2^20B
- 1 GB == 1024MB == 2^30B
他們之間的區別主要是大小
-
- byte 一個字節————(-128-127)
- short 兩個字節————(-32768-32767)
- int 四個字節————(........)
- long 八個字節————(........)
數字的范圍是如何計算出來的呢?
計算公式:
最高位是符號位(0表示正數,1表示負數),所以一個字節中的8位只有7位可以用,最大的數為
- 0111 1111 —— 2^7 - 1 == 127
- 1111 1111 —— - (2^7 - 1) == -127
但是最小為什么是 -128 呢?這就體現出印度人的聰明來了,因為是印度人發明的
- 0000 0000 —— 表示的是 0
- 1000 0000 —— 表示的是 -0
這不就浪費了一個數了嗎,所以人們就把 - 0 看成 -128,
- [-128] 原碼 = 1000 0000 —— 發生了溢出(二進制形式是1000 0000,恰巧和符號位一樣都是1不要誤解),反碼1000 0000是省略了最前面的1,因為溢出
- [-128] 反碼 = 1111 1111 —— 最高位是符號位所以不會改變,其余取反
- [-128] 補碼 = 1000 0000 —— 反碼 + 1,符號位不會受到影響
1 + 3 的計算過程(運算結果也為補碼)
- 原碼為:0000 0001 + 0000 0011
- 補碼為:0000 0001 + 0000 0011 = 0000 0100
- 運算結果也是補碼,但是符號位是0,一個正數,原碼就是它本身0000 0100 == 3
1 + -3 的計算過程
- 原碼為:0000 0001 + 1000 0011
- 補碼為: 0000 0001 + (1111 1100 + 1) = 0000 0001 + 1111 1101 = 1111 1110
- 符號位為1說明是一個負數,轉換為原碼得(1111 1110 - 1,再取反)1000 0010 == -2
1 + (-128) 計算機的計算過程為
- 原碼:0000 0001 + 1000 0000
- 轉換為補碼: 0000 0001 + 1000 0000 == 1000 0001
- 1000 0001 的符號位為1,是負數,轉換成原碼為(1000 0001 - 1,再取反)1111 1111 == -127
- -127的原碼為 1111 1111 , 補碼為 1000 0000 + 1 = 1000 0001
- 127的原碼為 0111 1111 ,補碼為 0111 1111
神奇的事情就是,把-0在取反碼進行計算后,結果就是用128進行計算的值!!!
用程序驗證byte型的大小
public class Hello { public static void main(String args[]) { byte bytel = 127; } } //程序可以正常運行 public class Hello { public static void main(String args[]) { byte bytel = 128; } } //報錯會損失精度 D:\myJavaDemo>javac -encoding UTF-8 Hello.java Hello.java:6: 錯誤: 不兼容的類型: 從int轉換到byte可能會有損失 byte bytel = 128; ^ 1 個錯誤
現有的數據結構不夠大的時候,可以用鏈表,字符數組,字符串來解決這樣的問題
浮點類型
浮點類型可以表示一個小數,常用的浮點類型有:float,double(單精度,雙精度),他們的區別主要是數據大小范圍
布爾類型
布爾類型可以表示,真或者假,類型是boolean
boolean spBool = true;
字符類型
字符類型可以表示 單個字符,字符類型是char
多個字符稱之為字符串,在java中用String(還真是大寫)這種數據類型表示,但是String不是基本數據類型,而是類,類是復合數據類型(之后會學習到)
java中字符的加減法
字符類型是一個特殊的整形
public class Hello { public static void main(String args[]) { int test1 = 'a' + 'b'; //把a和b對應的ascii碼的數相加,賦值給test1 char test2 = 'a' + 'b'; char test3 = '中'; //java中一個char占用兩個字節,所以可以存放漢字 char char1 = 'q'; int char2 = '中'; //中文是用unicode號存放的 System.out.println(test1); System.out.println(test2); System.out.println(test3); System.out.println(char1); System.out.println(char2); } } 運行結果: D:\myJavaDemo>java Hello 195 ? 中 q 20013 注:中對應的unicode碼為\u4e2d,為20013的16進制形式
結論:在java中,對char進行運算的時候,直接當做 ascii碼對應的整數 對待
java基本語法——定義變量、初始化、賦值
什么是定義變量?
int a1;
//這就是定義了一個變量,表示定義了一個整數,名字叫做a1
初始化變量
int a = 45; //這就是初始化變量,在定義變量的時候就給值
給變量賦值
int tt; tt = 7780;
int a=25;
a = 45;
//兩者都是給變量賦值
數據類型的轉換
例1
public class Hello { public static void main(String args[]) { int a = 1.2; } } 只要損失精度就會報錯: D:\myJavaDemo>javac -encoding UTF-8 Hello.java Hello.java:6: 錯誤: 不兼容的類型: 從double轉換到int可能會有損失 int a = 1.2; ^ 1 個錯誤
精度排行:byte < short < int < long < float < double
例2
public class Hello { public static void main(String args[]) { int b = 10; System.out.println(b); } } 輸出結果: 10
結論:數據可以從高精度轉到低精度
例3
public class Hello { public static void main(String args[]) { float a = 3.4; } } 報錯: D:\myJavaDemo>javac -encoding UTF-8 Hello.java Hello.java:6: 錯誤: 不兼容的類型: 從double轉換到float可能會有損失 float a = 3.4; ^ 1 個錯誤
因為在java中,小數的默認類型是double
float a = 3.4;
表示我要把一個double類型交給float類型,損失精度,報錯
例4
public class Hello { public static void main(String args[]) { float a = 3.4f; //加上f就明確表示用float類型,就可以通過編譯了 } }
將高精度強制轉換為低精度
例5
public class Hello { public static void main(String args[]) { float a = 3.4f; int b = (int)a; int c = (int)1.9; System.out.println(a); System.out.println(b); System.out.println(c); } } 輸出結果: D:\myJavaDemo>java Hello 3.4 3 1
可以看出(int)1.9的結果為1,強制轉換會直接省略掉后面的
例6
public class Hello { public static void main(String args[]) { float a = 3.4f; int b = a; System.out.println(a); System.out.println(b); } } 報錯: D:\myJavaDemo>javac -encoding UTF-8 Hello.java Hello.java:7: 錯誤: 不兼容的類型: 從float轉換到int可能會有損失 int b = a; ^ 1 個錯誤
只要造成精度損失就會報錯
例7
public class Hello { public static void main(String args[]) { float a = 3; int b = a + 3.4; System.out.println(a); System.out.println(b); } } 報錯: D:\myJavaDemo>javac -encoding UTF-8 Hello.java Hello.java:7: 錯誤: 不兼容的類型: 從double轉換到int可能會有損失 int b = a + 3.4; ^ 1 個錯誤
a + 3.4的結果會自動往高精度轉換,就造成了a+3.4的結果是個double類型的,而b是個int類型,損失精度報錯
注: 1 + 3.4f + 6.2的結果是double類型的