Java基礎知識(變數、資料型別、運算子)
一、變數的定義和使用
變數的定義: 定義出一個符號,這個符號在某個範圍內,就代表一個變化的值。
變數的賦值:為了一個符號,賦予一個明確的值
int w; //定義變數w
w=5; //給w賦值,當前值為5
變數的定義+初始化:
int w=7; //定義w且值為7
變數的使用:
int w = 7;
int h = 2;
System.out.println(w * h); // 使用 w、h 這兩個變數。列印 14
總結:
- 變數必須先定義,才能被使用。
- 變數如果先被賦值或者初始化,才能被使用。
變數形態
二、資料型別
1.整形變數
int 變數名 =初始值;
//例:
int num=10;
注:在Java中,一個int變數佔4個位元組,和作業系統 沒有直接關係。表示的範圍是 -2^31 到 2^31-1,也就是-21億到+21億。
2.長整型變數
long 變數名=初始值;
//例:
long num=10L;
注:Java中long佔8個位元組,表示的資料範圍 -2^63到 2^63-1
3.雙精度浮點型變數
double 變數名=初始值;
//例:
double num=10.0;
舉例1:
int a=1;
int b=2;
Syestem.out.println(a/b);
//執行結果: 0
在 Java中,int除以int的值仍然是int(會捨棄掉小數部分)
如果要得到0.5,需要使用double型別計算。
double a=1;
double b=2;
Syestem.out.println(a/b);
//執行結果: 0.5
舉例2
double num=1.1;
Syestem.out.println(num * num);
//執行結果:1.2100000000000002
注:
- Java 中的 double 雖然也是 8 個位元組, 但是浮點數的記憶體佈局和整數差別很大, 不能單純的用 2 ^ n 的形式表示資料範圍.
- Java 的 double 型別的記憶體佈局遵守 IEEE 754 標準((-1)^S *M 2^E), 嘗試使用有限的記憶體空間表示可能無限的小數, 勢必會存在一定的精度誤差.
4.單精度浮點型變數
float 變數名=初始值;
//例:
float num=10.0f;
5.字元型別變數
char 變數名=初始值;
//例:
char ch='A';
注:
- Java 中使用 單引號 + 單個字母 的形式表示字元字面值.
- 計算機中的字元本質上是一個整數. 在 C 語言中使用 ASCII 表示字元, 而 Java 中使用 Unicode 表示字元,因此一個字元佔用兩個位元組,表示的字元種類更多,包括中文。
使用一個字元表示漢字:
char ch='啊';
6.位元組型別變數
byte 變數名=初始值;
//例:
byte value=0;
注:
- 位元組型別表示的也是整數. 只佔一個位元組, 表示範圍較小 ( -128 -> +127 )
- 位元組型別和字元型別互不相干.
7.短整型變數
short 變數名=初始值;
//例:
short value=0;
注:
- short 佔用 2 個位元組, 表示的資料範圍是 -32768 -> +32767
- 這個表示範圍比較小,一般不推薦使用
8.布林型別變數
boolean 變數名=初始值;
//例:
boolean value=true;
注:
- boolean 型別的變數只有兩種取值, true 表示真, false 表示假.
- Java 的 boolean 型別和 int 不能相互轉換, 不存在 1 表示 true, 0 表示 false 這樣的用法.
- boolean 型別有些 JVM 的實現是佔 1 個位元組, 有些是佔 1 個位元位, 這個沒有明確規定.
9.字串型別變數
注:String型別不是基本資料型別,而是引用資料型別
String 變數名="初始值";
//例:
String name="zhangsan";
注:
- Java 使用 雙引號 + 若干字元 的方式表示字串字面值.
- 和上面的型別不同, String 不是基本型別, 而是引用型別(後面重點解釋).
- 字串中的一些特定的不太方便的直接表示的字元需要轉義。
字串的 + 操作。表示字串拼接:
String a = "hello";
String b = "world";
String c = a + b;
System.out.println(c);
//執行結果: helloworld
還可以用字串和整數進行拼接:
String str = "result = ";
int a = 10;
int b = 20;
String result = str + a + b;
System.out.println(result);
// 執行結果: result = 1020
變數的命名規則:
- 一個變數名只能包含數字, 字母, 下劃線
- 數字不能開頭.
- 變數名是大小寫敏感的. 即 num 和 Num 是兩個不同的變數
三、變數的作用域
也就是該變數能生效的範圍,一般是變數定義所在的程式碼塊(大括號)
舉例1:
class Test {
public static void main(String[] args) {
{
int x = 10;
System.out.println(x); // 編譯通過;
}
System.out.println(x); // 編譯失敗, 找不到變數 x.
}
}
舉例2:
class Test {
public static void main(String[] args) {
{
int x = 10; // 這裡定義了一個變數 x,型別是 int,值是 10
System.out.println(x); // 會列印 10
}
{
double x = 20.0; // 這裡又定義了一個變數 x,型別是 double,值是20.0
// 和上面的變數完全無關,只是用到的符號(變數名)相同
四、字面值和常量
1.字面值
10 // int 字面值常量(十進位制)
010 // int 字面值常量(八進位制) 由數字 0 開頭. 010 也就是十進位制的 8
0x10 // int 字面值常量(十六進位制) 由數字 0x 開頭. 0x10 也就是十進位制的 16
10L // long 字面值常量. 也可以寫作 10l (小寫的L)
1.0 // double 字面值常量. 也可以寫作 1.0d 或者 1.0D
1.5e2 // double 字面值常量. 科學計數法表示. 相當於 1.5 * 10^2
1.0f // float 字面值常量, 也可以寫作 1.0F
true // boolen 字面值常量, 同樣的還有 false
'a' // char 字面值常量, 單引號中只能有一個字元
"abc" // String 字面值常量, 雙引號中可以有多個字元.
2.final關鍵字修飾的常量
final int a = 10;
a = 20;
// 編譯出錯. 提示 無法為最終變數a分配值
五、型別轉換
Java是一個強型別程式語言,當不同型別的變數之間相互賦值的時候,會有較強的校驗。
舉例1:int 和long/double相互賦值
int a = 10;
long b = 20;
a = b; // 編譯出錯, 提示可能會損失精度.
b = a; // 編譯通過.
int a = 10;
double b = 1.0;
a = b; // 編譯出錯, 提示可能會損失精度.
b = a; //編譯通過。
long 表示的範圍更大, 可以將 int 賦值給 long, 但是不能將 long 賦值給 int.
double 表示的範圍更大, 可以將 int 賦值給 double, 但是不能將 double 賦值給 int.
結論: 不同數字型別的變數之間賦值,表示範圍更小的型別能隱式轉換為範圍大的型別,反之則不行。
舉例2:int 和boolean相互賦值
int a = 10;
boolean b = true;
b = a; // 編譯出錯, 提示不相容的型別
a=b; // 編譯出錯, 提示不相容的型別
結論: int 和 boolean 是毫不相干的兩種型別, 不能相互賦值.
舉例3: int字面常量給byte賦值
byte a = 100; // 編譯通過
byte b=256; //編譯報錯,提示從int轉換到byte可能會有損失
注意: byte 表示的資料範圍是 -128 -> +127, 256 已經超過範圍, 而 100 還在範圍之內.
結論: 使用字面值常量賦值的時候, Java 會自動進行一些檢查校驗, 判定賦值是否合理.
使用強制型別轉換
int a = 0;
double b = 10.5;
a = (int)b;
int a = 10;
boolean b = false;
b = (boolean)a; // 編譯出錯, 提示不相容的型別
結論:
使用 (型別) 的方式可以將 double 型別強制轉成 int.
但是
- 強制型別轉換可能會導致精度丟失. 如剛才的例子中, 賦值之後, 10.5 就變成 10 了, 小數點後面的部
分被忽略. - 強制型別轉換不是一定能成功, 互不相干的型別之間無法強轉.型別轉換
小結:
- 不同數字型別的變數之間賦值, 表示範圍更小的型別能隱式轉換成範圍較大的型別.
- 如果需要把範圍大的型別賦值給範圍小的, 需要強制型別轉換, 但是可能精度丟失.
- 將一個字面值常量進行賦值的時候, Java 會自動針對數字範圍進行檢查.
六、數值提升
舉例1:int和long混合運算
int a = 10;
long b = 20;
int c = a + b; // 編譯出錯, 提示將 long 轉成 int 會丟失精度
long d = a + b;//編譯通過
結論: 當 int 和 long 混合運算的時候, int 會提升成 long, 得到的結果仍然是 long 型別, 需要使用 long 型別的變數來接收結果. 如果非要用 int 來接收結果, 就需要使用強制型別轉換.
舉例2:byte和byte的運算
byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
// 編譯報錯: 錯誤: 不相容的型別: 從int轉換到byte可能會有損失
結論: byte 和 byte 都是相同型別, 但是出現編譯報錯. 原因是, 雖然 a 和 b 都是 byte, 但是計算 a + b 會先將 a 和 b 都提升成 int, 再進行計算, 得到的結果也是 int, 這是賦給 c, 就會出現上述錯誤.
由於計算機的 CPU 通常是按照 4 個位元組為單位從記憶體中讀寫資料. 為了硬體上實現方便, 諸如 byte 和
short 這種低於 4 個位元組的型別, 會先提升成 int, 再參與計算。
正確的寫法:
byte a = 10;
byte b = 20;
byte c = (byte)(a + b);
System.out.println(c);
型別提升小結:
- 不同型別的資料混合運算, 範圍小的會提升成範圍大的.
- 對於 short, byte 這種比 4 個位元組小的型別, 會先提升成 4 個位元組的 int , 再運算.
七、int和String之間的相互轉換
int 轉String
int num = 10;
// 方法1
String str1 = num + "";
// 方法2
String str2 = String.valueOf(num);
String轉int
String str = "100";
int num = Integer.ParseInt(str);
八、列印輸出
基本語法:
System.out.println(msg); // 輸出一個字串, 帶換行
System.out.print(msg); // 輸出一個字串, 不帶換行
System.out.printf(format, msg); // 格式化輸出
System.out.println(format,msg);//完全等同於 printf
注:
- println 輸出的內容自帶 %n, print 不帶 %n
- printf 的格式化輸出方式和 C 語言的 printf 是基本一致的.
九、運算子
1.賦值運算子 =
為一個變數進行賦值操作
int a=10;
a=20;
2.算術運算子
• 基本四則運算子: + -* / %
•增量賦值運算子 : += -= *= /= %=
•自增/自減運算子 : ++ - -
int a = 10;
int b = ++a;
System.out.println(b);
int c = a++;
System.out.println(c);
結論:
- 如果不取自增運算的表示式的返回值, 則前置自增和後置自增沒有區別.
- 如果取表示式的返回值, 則前置自增的返回值是自增之後的值, 後置自增的返回值是自增之前的值.
3.關係運算子
關係運算子主要有六個: == != < > <= >=
int a = 10;
int b = 20;
System.out.println(a == b);
System.out.println(a != b);
System.out.println(a < b);
System.out.println(a > b);
System.out.println(a <= b);
System.out.println(a >= b);
注意: 關係運算子的表示式返回值都是 boolean 型別.
4.邏輯運算子
邏輯運算子主要有三個:&& || !
注意: 邏輯運算子的運算元(運算元往往是關係運算子的結果)和返回值都是 boolean .
注意: 邏輯運算子的運算元(運算元往往是關係運算子的結果)和返回值都是 boolean .
邏輯與 &&
規則: 兩個運算元都為true,結果為true,否則結果為false。
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b && b < c);
邏輯或 ||
規則:兩個運算元都為false,結果為false,否則結果為true。
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b ||b < c);
邏輯非 !
規則: 運算元為 true, 結果為 false; 運算元為 false, 結果為 true(這是個單目運算子, 只有一個運算元)
int a = 10;
int b = 20;
System.out.println(!a < b);
短路求值
- 對於 && , 如果左側表示式值為 false, 則表示式的整體的值一定是 false, 無需計算右側表示式.
- 對於 ||, 如果左側表示式值為 true, 則表示式的整體的值一定是 true, 無需計算右側表示式.
&和|(不推薦使用)
& 和 | 如果運算元為 boolean 的時候, 也表示邏輯運算,但是和&&以及||相比,它們不支援短路求值。
System.out.println(10 > 20 & 10 / 0 == 0);// 程式丟擲異常
System.out.println(10 < 20 |0==0);// 程式丟擲異常
5.位運算子
Java 中對資料的操作的最小單位不是位元組, 而是二進位制位.
位運算子主要有四個:& | ~ ^
位操作表示 按二進位制位運算. 計算機中都是使用二進位制來表示資料的(01構成的序列), 按位運算就是在按
照二進位制位的每一位依次進行計算.
按位與 &:如果兩個二進位制位都是1,則結果為1,否則為0.
int a = 10;
int b = 20;
System.out.println(a&b);
按位或 | :如果兩個二進位制位都是0,則結果為0,否則為1.
按位取反 ~:如果該位為0則轉為1,如果該位位1則轉為0.
按位異或 ^:如果兩個數字的二進位制位相同,則相同為0,則相異結果為1.
6.移位運算
移位運算子有三個: << >> >>>
都是按照二進位制位來運算.
左移<<:最左側位不要了,最右側補0.
右移>>:最右側位不要了,最左側補符號位(正數補0,負數補1)
無符號右移>>>>:最右側位不要了,最左側補0.
注:
- 左移 1 位, 相當於原數字 * 2. 左移 N 位, 相當於原數字 * 2 的N次方.
- 右移 1 位, 相當於原數字 / 2. 右移 N 位, 相當於原數字 / 2 的N次方.
- 由於計算機計算移位效率高於計算乘除, 當某個程式碼正好乘除 2 的N次方的時候可以用移位運算代
替. - 移動負數位或者移位位數過大都沒有意義.
7.條件運算子
條件運算子只有一個:
表示式1 ? 表示式2 : 表示式3
當 表示式1 的值為 true 時, 整個表示式的值為 表示式2 的值; 當 表示式1 的值為 false 時, 整個表示式的值為 表示式3 的值.
也是Java中的唯一一個三目運算子,是條件判斷語句的簡化寫法。
相關文章
- Java基礎:Java變數、資料型別、運算子(2)Java變數資料型別
- JAVA基礎--資料型別和運算子Java資料型別
- java基礎知識--資料型別Java資料型別
- java基礎語法--註釋、識別符號、關鍵字、資料型別、型別轉換、變數、常量、作用域、運算子Java符號資料型別變數
- Java基礎知識-基本資料型別相互轉型Java資料型別
- java基礎一:基本型別,運算子號Java型別
- JavaScript中的變數、資料型別以及運算子JavaScript變數資料型別
- python教程1.2:變數+資料型別+運算子Python變數資料型別
- Python3基礎——運算子、資料型別Python資料型別
- 【java資料型別和運算子】Java資料型別
- 面試-JS基礎知識-變數型別和計算面試JS變數型別
- Java程式設計基礎03——進位制運算&資料型別&變數Java程式設計資料型別變數
- Go變數與基礎資料型別Go變數資料型別
- Java中的資料型別和運算子Java資料型別
- Java 基礎 之 算數運算子Java
- JAVA-識別符號、變數、資料型別Java符號變數資料型別
- 資料型別和運算子資料型別
- Java 基礎-運算子Java
- == 運算子 - Java基礎Java
- 黑馬程式設計師-Java基礎【1】(關鍵字,識別符號,常量,變數,運算子)程式設計師Java符號變數
- C++基礎知識篇:C++ 運算子C++
- java資料型別基礎Java資料型別
- python的基礎資料型別有哪些知識Python資料型別
- JavaScript資料型別與運算子JavaScript資料型別
- [java基礎]之 運算子Java
- Java培訓基礎知識-Java的常量與變數Java變數
- Js基礎知識(一) – 變數JS變數
- [java基礎]之資料型別Java資料型別
- Java基礎09:邏輯運算子、位運算子Java
- javaScript資料型別與typeof運算子JavaScript資料型別
- java基礎學習之二:變數、基本資料型別及其對應的包裝型別Java變數資料型別
- Java檢視變數資料型別Java變數資料型別
- Java基礎——邏輯運算子Java
- [打牢基礎系列]JavaScript的變數和資料型別JavaScript變數資料型別
- 談談Java基礎資料型別Java資料型別
- JAVA基礎:Java變數型別間的相互轉換(轉)Java變數型別
- 資料型別和運算子測試題資料型別
- 【Python基礎知識】Python中的邏輯運算子Python