大家好呀,最近很多小伙伴問我一些很基礎的問題,看來是基礎沒有打牢啊,這期我就在代碼中帶大家回顧Java中的基礎知識,可以自己敲一下看看,加深理解,根據這些知識我還整理了一張圖,基本上每個知識點都有注釋詳解,大家有需要的可以找我要,點這里加群領取資料


選自己想看的戳上去哦
- Java中的類
- Java中的變數
- Java中的常量
- 資料型別
- byte,short,int,long四大整型型別
- float,double兩大浮點型別
- 字符型別
- 布爾型別
- 整數運算
- 自增/自減
- 位移運算
- 位運算
- 相關概念
- 運算優先級
- 溢位
- 型別轉換
- 浮點數數運算
- 相關概念
- 溢位
- 強制轉型
- 型別提升
- 布爾運算
- 短路運算
- 最后,祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峰, 可以的話請給我一個三連支持一下我喲,我們下期再見
Java中的類
我們先剖析一個完整的Java程式,它的基本結構是什么:
/**
* 可以用來自動創建檔案的注釋
*/
public class Hello {
public static void main(String[] args) {
// 向螢屏輸出文本:
System.out.println("Hello, world!");
/* 多行注釋開始
注釋內容
注釋結束 */
}
} // class定義結束
因為Java是面向物件的語言,一個程式的基本單位就是class,class是關鍵字,這里定義的class名字就是Hello:
public class Hello { // 類名是Hello
// ...
} // class定義結束
類名要求:
類名必須以英文字母開頭,后接字母,數字和下劃線的組合,習慣以大寫字母開頭,
要注意遵守命名習慣,好的類命名:
Hello
NoteBook
VRPlayer
注意到public是訪問修飾符,表示該class是公開的,
不寫public,也能正確編譯,但是這個類將無法從命令列執行,
在class內部,可以定義若干方法(method):
public class Hello {
public static void main(String[] args) { // 方法名是main
// 方法代碼...
} // 方法定義結束
}
方法定義了一組執行陳述句,方法內部的代碼將會被依次順序執行,
這里的方法名是main,回傳值是void,表示沒有任何回傳值,
我們注意到public除了可以修飾class外,也可以修飾方法,而關鍵字static是另一個修飾符,它表示靜態方法,后面我們會講解方法的型別,目前,我們只需要知道,Java入口程式規定的方法必須是靜態方法,方法名必須為main,括號內的引數必須是String陣列,
方法名也有命名規則,命名和class一樣,但是首字母小寫:
好的方法命名:
main
goodMorning
playVR
在方法內部,陳述句才是真正的執行代碼,Java的每一行陳述句必須以分號結束:
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, world!"); // 陳述句
}
}
在Java程式中,注釋是一種給人閱讀的文本,不是程式的一部分,所以編譯器會自動忽略注釋,
Java中的變數
在Java中,變數分為兩種:基本型別的變數和參考型別的變數,
我們先討論基本型別的變數,
在Java中,變數必須先定義后使用,在定義變數的時候,可以給它一個初始值,例如:
int x = 1;
上述陳述句定義了一個整型int型別的變數,名稱為x,初始值為1,
不寫初始值,就相當于給它指定了默認值,默認值總是0,
來看一個完整的定義變數,然后列印變數值的例子:
// 定義并列印變數
public class Main {
public static void main(String[] args) {
int x = 100; // 定義int型別變數x,并賦予初始值100
System.out.println(x); // 列印該變數的值
}
}
運行結果:
100
變數的一個重要特點是可以重新賦值,例如,對變數x,先賦值100,再賦值200,觀察兩次列印的結果:
// 重新賦值變數
public class Main {
public static void main(String[] args) {
int x = 100; // 定義int型別變數x,并賦予初始值100
System.out.println(x); // 列印該變數的值,觀察是否為100
x = 200; // 重新賦值為200
System.out.println(x); // 列印該變數的值,觀察是否為200
}
}
運行結果:
100
200
注意到第一次定義變數x的時候,需要指定變數型別int,因此使用陳述句int x = 100;,而第二次重新賦值的時候,變數x已經存在了,不能再重復定義,因此不能指定變數型別int,必須使用陳述句x = 200;,
變數不但可以重新賦值,還可以賦值給其他變數,讓我們來看一個例子:
// 變數之間的賦值
public class Main {
public static void main(String[] args) {
int n = 100; // 定義變數n,同時賦值為100
System.out.println("n = " + n); // 列印n的值
n = 200; // 變數n賦值為200
System.out.println("n = " + n); // 列印n的值
int x = n; // 變數x賦值為n(n的值為200,因此賦值后x的值也是200)
System.out.println("x = " + x); // 列印x的值
x = x + 100; // 變數x賦值為x+100(x的值為200,因此賦值后x的值是200+100=300)
System.out.println("x = " + x); // 列印x的值
System.out.println("n = " + n); // 再次列印n的值,n應該是200還是300?
}
}
運行結果:
n = 100
n = 200
x = 200
x = 300
n = 200
Java中的常量
定義變數的時候,如果加上final修飾符,這個變數就變成了常量:
final double PI = 3.14; // PI是一個常量
double r = 5.0;
double area = PI * r * r;
PI = 300; // compile error!
常量在定義時進行初始化后就不可再次賦值,再次賦值會導致編譯錯誤,
常量的作用是用有意義的變數名來避免魔術數字(Magic number),例如,不要在代碼中到處寫3.14,而是定義一個常量,如果將來需要提高計算精度,我們只需要在常量的定義處修改,例如,改成3.1416,而不必在所有地方替換3.14,
根據習慣,常量名通常全部大寫,
資料型別
byte,short,int,long四大整型型別
Java只定義了帶符號的整型,因此,最高位的bit表示符號位(0表示正數,1表示負數),各種整型能表示的最大范圍如下:
byte:-128 ~ 127
short: -32768 ~ 32767
int: -2147483648 ~ 2147483647
long: -9223372036854775808 ~ 9223372036854775807
我們來看定義整型的例子:
// 定義整型
public class Main {
public static void main(String[] args) {
int i = 2147483647;
int i2 = -2147483648;
int i3 = 2_000_000_000; // 加下劃線更容易識別
int i4 = 0xff0000; // 十六進制表示的16711680
int i5 = 0b1000000000; // 二進制表示的512
long l = 9000000000000000000L; // long型的結尾需要加L
}
}
特別注意:同一個數的不同進制的表示是完全相同的,例如15=0xf=0b1111,
float,double兩大浮點型別
浮點型別的數就是小數,因為小數用科學計數法表示的時候,小數點是可以“浮動”的,如1234.5可以表示成12.345x102,也可以表示成1.2345x103,所以稱為浮點數,
下面是定義浮點數的例子:
float f1 = 3.14f;
float f2 = 3.14e38f; // 科學計數法表示的3.14x10^38
double d = 1.79e308;
double d2 = -1.79e308;
double d3 = 4.9e-324; // 科學計數法表示的4.9x10^-324
對于float型別,需要加上f后綴,
浮點數可表示的范圍非常大,float型別可最大表示3.4x1038,而double型別可最大表示1.79x10308,
字符型別
字符型別char是基本資料型別,它是character的縮寫,一個char保存一個Unicode字符:
char c1 = 'A';
char c2 = '中';
因為Java在記憶體中總是使用Unicode表示字符,所以,一個英文字符和一個中文字符都用一個char型別表示,它們都占用兩個位元組,要顯示一個字符的Unicode編碼,只需將char型別直接賦值給int型別即可:
int n1 = 'A'; // 字母“A”的Unicodde編碼是65
int n2 = '中'; // 漢字“中”的Unicode編碼是20013
還可以直接用轉義字符\u+Unicode編碼來表示一個字符:
// 注意是十六進制:
char c3 = '\u0041'; // 'A',因為十六進制0041 = 十進制65
char c4 = '\u4e2d'; // '中',因為十六進制4e2d = 十進制20013
字符型別char表示一個字符,Java的char型別除了可表示標準的ASCII外,還可以表示一個Unicode字符:
// 字符型別
public class Main {
public static void main(String[] args) {
char a = 'A';
char zh = '中';
System.out.println(a);
System.out.println(zh);
}
}
運行結果:
A
中
注意char型別使用單引號’,且僅有一個字符,要和雙引號"的字串型別區分開,
布爾型別
布爾型別boolean只有true和false兩個值,布爾型別總是關系運算的計算結果:
boolean b1 = true;
boolean b2 = false;
boolean isGreater = 5 > 3; // 計算結果為true
int age = 12;
boolean isAdult = age >= 18; // 計算結果為false
Java語言對布爾型別的存盤并沒有做規定,因為理論上存盤布爾型別只需要1 bit,但是通常JVM內部會把boolean表示為4位元組整數,
整數運算
自增/自減
Java還提供了++運算和–運算,它們可以對一個整數進行加1和減1的操作:
// 自增/自減運算
public class Main {
public static void main(String[] args) {
int n = 3300;
n++; // 3301, 相當于 n = n + 1;
n--; // 3300, 相當于 n = n - 1;
int y = 100 + (++n); // 不要這么寫
System.out.println(y);
}
}
運行結果:
3401
位移運算
在計算機中,整數總是以二進制的形式表示,例如,int型別的整數7使用4位元組表示的二進制如下:
00000000 0000000 0000000 00000111
可以對整數進行移位運算,對整數7左移1位將得到整數14,左移兩位將得到整數28:
int n = 7; // 00000000 00000000 00000000 00000111 = 7
int a = n << 1; // 00000000 00000000 00000000 00001110 = 14
int b = n << 2; // 00000000 00000000 00000000 00011100 = 28
int c = n << 28; // 01110000 00000000 00000000 00000000 = 1879048192
int d = n << 29; // 11100000 00000000 00000000 00000000 = -536870912
左移29位時,由于最高位變成1,因此結果變成了負數,
類似的,對整數28進行右移,結果如下:
int n = 7; // 00000000 00000000 00000000 00000111 = 7
int a = n >> 1; // 00000000 00000000 00000000 00000011 = 3
int b = n >> 2; // 00000000 00000000 00000000 00000001 = 1
int c = n >> 3; // 00000000 00000000 00000000 00000000 = 0
如果對一個負數進行右移,最高位的1不動,結果仍然是一個負數:
int n = -536870912;
int a = n >> 1; // 11110000 00000000 00000000 00000000 = -268435456
int b = n >> 2; // 11111000 00000000 00000000 00000000 = -134217728
int c = n >> 28; // 11111111 11111111 11111111 11111110 = -2
int d = n >> 29; // 11111111 11111111 11111111 11111111 = -1
還有一種不帶符號的右移運算,使用>>>,它的特點是符號位跟著動,因此,對一個負數進行>>>右移,它會變成正數,原因是最高位的1變成了0:
int n = -536870912;
int a = n >>> 1; // 01110000 00000000 00000000 00000000 = 1879048192
int b = n >>> 2; // 00111000 00000000 00000000 00000000 = 939524096
int c = n >>> 29; // 00000000 00000000 00000000 00000111 = 7
int d = n >>> 31; // 00000000 00000000 00000000 00000001 = 1
對byte和short型別進行移位時,會首先轉換為int再進行位移,
仔細觀察可發現,左移實際上就是不斷地×2,右移實際上就是不斷地÷2,
位運算
位運算是按位進行與、或、非和異或的運算,
與運算的規則是,必須兩個數同時為1,結果才為1:
n = 0 & 0; // 0
n = 0 & 1; // 0
n = 1 & 0; // 0
n = 1 & 1; // 1
或運算的規則是,只要任意一個為1,結果就為1:
n = 0 | 0; // 0
n = 0 | 1; // 1
n = 1 | 0; // 1
n = 1 | 1; // 1
非運算的規則是,0和1互換:
n = ~0; // 1
n = ~1; // 0
異或運算的規則是,如果兩個數不同,結果為1,否則為0:
n = 0 ^ 0; // 0
n = 0 ^ 1; // 1
n = 1 ^ 0; // 1
n = 1 ^ 1; // 0
對兩個整數進行位運算,實際上就是按位對齊,然后依次對每一位進行運算,例如:
// 位運算
public class Main {
public static void main(String[] args) {
int i = 167776589; // 00001010 00000000 00010001 01001101
int n = 167776512; // 00001010 00000000 00010001 00000000
System.out.println(i & n); // 167776512
}
}
運行結果:
167776512
上述按位與運算實際上可以看作兩個整數表示的IP地址10.0.17.77和10.0.17.0,通過與運算,可以快速判斷一個IP是否在給定的網段內,
相關概念
運算優先級
在Java的計算運算式中,運算優先級從高到低依次是:
( )
! ~ ++ –
/ %
±<< >> >>> & |
+= -== /=
記不住也沒關系,只需要加括號就可以保證運算的優先級正確,
溢位
要特別注意,整數由于存在范圍限制,如果計算結果超出了范圍,就會產生溢位,而溢位不會出錯,卻會得到一個奇怪的結果:
// 運算溢位
public class Main {
public static void main(String[] args) {
int x = 2147483640;
int y = 15;
int sum = x + y;
System.out.println(sum); // -2147483641
}
}
運算結果:
-2147483641
型別轉換
在運算程序中,如果參與運算的兩個數型別不一致,那么計算結果為較大型別的整型,例如,short和int計算,結果總是int,原因是short首先自動被轉型為int:
// 型別自動提升與強制轉型
public class Main {
public static void main(String[] args) {
short s = 1234;
int i = 123456;
int x = s + i; // s自動轉型為int
short y = s + i; // 編譯錯誤!
}
}
運行結果:
Main.java:7: 錯誤: 不兼容的型別: 從int轉換到short可能會有損失
short y = s + i; // 編譯錯誤!
^ 1 個錯誤 錯誤: 編譯失敗
也可以將結果強制轉型,即將大范圍的整數轉型為小范圍的整數,強制轉型使用(型別),例如,將int強制轉型為short:
int i = 12345;
short s = (short) i; // 12345
要注意,超出范圍的強制轉型會得到錯誤的結果,原因是轉型時,int的兩個高位位元組直接被扔掉,僅保留了低位的兩個位元組:
// 強制轉型
public class Main {
public static void main(String[] args) {
int i1 = 1234567;
short s1 = (short) i1; // -10617
System.out.println(s1);
int i2 = 12345678;
short s2 = (short) i2; // 24910
System.out.println(s2);
}
}
運行結果:
-10617
24910
因此,強制轉型的結果很可能是錯的,
浮點數數運算
基本運算和整數運算一樣,
相關概念
溢位
整數運算在除數為0時會報錯,而浮點數運算在除數為0時,不會報錯,但會回傳幾個特殊值:
NaN表示Not a Number
Infinity表示無窮大
-Infinity表示負無窮大
例如:
double d1 = 0.0 / 0; // NaN
double d2 = 1.0 / 0; // Infinity
double d3 = -1.0 / 0; // -Infinity
強制轉型
可以將浮點數強制轉型為整數,在轉型時,浮點數的小數部分會被丟掉,如果轉型后超過了整型能表示的最大范圍,將回傳整型的最大值,例如:
int n1 = (int) 12.3; // 12
int n2 = (int) 12.7; // 12
int n2 = (int) -12.7; // -12
int n3 = (int) (12.7 + 0.5); // 13
int n4 = (int) 1.2e20; // 2147483647
如果要進行四舍五入,可以對浮點數加上0.5再強制轉型:
// 四舍五入
public class Main {
public static void main(String[] args) {
double d = 2.6;
int n = (int) (d + 0.5);
System.out.println(n);
}
}
運行結果:
3
型別提升
如果參與運算的兩個數其中一個是整型,那么整型可以自動提升到浮點型:
// 型別提升
public class Main {
public static void main(String[] args) {
int n = 5;
double d = 1.2 + 24.0 / n; // 6.0
System.out.println(d);
}
}
運行結果:
6.0
需要特別注意,在一個復雜的四則運算中,兩個整數的運算不會出現自動提升的情況,例如:
double d = 1.2 + 24 / 5; // 5.2
計算結果為5.2,原因是編譯器計算24 / 5這個子運算式時,按兩個整數進行運算,結果仍為整數4,
布爾運算
對于布爾型別boolean,永遠只有true和false兩個值,
布爾運算是一種關系運算,包括以下幾類:
(因為符號比較多,與編輯器的一些指令沖突,全用代碼塊表示了)
比較運算子:>,>=,<,<=,==,!=
與運算 &&
或運算 ||
非運算 !
下面是一些示例:
boolean isGreater = 5 > 3; // true
int age = 12;
boolean isZero = age == 0; // false
boolean isNonZero = !isZero; // true
boolean isAdult = age >= 18; // false
boolean isTeenager = age >6 && age <18; // true
關系運算子的優先級從高到低依次是:
!
>,>=,<,<=
==,!=
&&
||
短路運算
布爾運算的一個重要特點是短路運算,如果一個布爾運算的運算式能提前確定結果,則后續的計算不再執行,直接回傳結果,
因為false && x的結果總是false,無論x是true還是false,因此,與運算在確定第一個值為false后,不再繼續計算,而是直接回傳false,
我們考察以下代碼:
// 短路運算
public class Main {
public static void main(String[] args) {
boolean b = 5 < 3;
boolean result = b && (5 / 0 > 0);
System.out.println(result);
}
}
運行結果:
false
如果沒有短路運算,&&后面的運算式會由于除數為0而報錯,但實際上該陳述句并未報錯,原因在于與運算是短路運算子,提前計算出了結果false,
如果變數b的值為true,則運算式變為true && (5 / 0 > 0),因為無法進行短路運算,該運算式必定會由于除數為0而報錯,可以自行測驗,
類似的,對于||運算,只要能確定第一個值為true,后續計算也不再進行,而是直接回傳true:
boolean result = true || (5 / 0 > 0); // true
最后,祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峰, 可以的話請給我一個三連支持一下我喲,我們下期再見
領取資料

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/294698.html
標籤:java
上一篇:# Day13-Java基礎
