?
一、初見Java
(1)Java簡介
首先不得不承認Java是一門優秀的程序設計語言
其系列的計算機軟件和跨平臺體系包括國內的生態鏈完善是C/C++語言難以彌補的
(2)Java SE
全稱Java Standard Edition,是Java體系的基礎
(3)Java EE
全稱Java Platform Enterprise Edition,是Java體系的進階
##它們的區別:SE可在JVM標準下運行,而EE需要特定的服務器
二、Java語言特點
簡潔安全
去除了C++中指針、多重繼承等復雜特性,自帶垃圾回收,杜絕內存泄漏風險
純面向對象萬物皆對象,通過接口實現靈活擴展,反射機制支持運行時動態解析
跨平臺能力基于字節碼和JVM實現"一次編寫,到處運行",嚴格規范數據類型保證移植一致性
健壯高效異常處理機制+強類型驗證,JIT編譯器優化使性能接近C++水平
并發網絡原生支持多線程編程,完善網絡庫為分布式開發提供基礎設施
三、Hello World
給出Java中的Hello World代碼。你會發現為什么在Java中是這么大一坨,跟C/C++區別很大
public class Try {public static void main(String[] args) {System.out.println("hello world");}
}
如果你學過C++,就知道上面的Try是一個類名,下面的好像是一個“函數”,里面跟著打印結果
但是在Java中并不存在函數一說,在Java中
最外層的是類,中間層是方法(你可以理解為函數)里層是語句三個部分組成
我們畫個圖來解釋下
?因此這段代碼就可以理解為在一個名字叫Try的類中,通過main方法,執行了一條打印語句
四、文檔注釋
這個是來聲明文檔信息的,網上有很多對應教程,建議聲明關鍵必要的信息
五、上手實操寫代碼
本次使用的IDE是Idea2025.1.1社區版
在ieda我們創建一個新項目,注意你的項目名是和代碼的類名是一致的
我們正好來講標識符的常用命名規則(駝峰命名法)
類名:大駝峰,一般類名由多個單次組成,則每個單次首字母都要大寫,比如:
方法名,變量名:小駝峰,多個單詞中從第二個單次開始的首字母都要大寫,比如:
int simpleNum = 10;
Java中寫代碼與C語言不同,不需要一個個代碼手搓
回車就可以完成各條語句的撰寫,比如sout表示輸出打印,main表示main方法等
而且我們發現,在Java中printlen可以打印任何類型字符,無論是整形還是字符
printlrn表示打印后換行,print直接打印不換行,而printf表規范打印(不常用)
public static void main(String[] args) {System.out.println("hello world");System.out.println("666");System.out.println("12.56");System.out.println("你好世界");System.out.print("simple");System.out.printf("%d",15); }
六、Java中八種基本類型
有字節型(Byte),整型,短整型,長整型,單精浮點型,雙精浮點型
字符型(Java中占兩個字節,其存儲字符范圍也比C/C++中廣很多)
布爾型(boolean,只有true和falsel,沒有表示0和1)
七、變量(基本類型八大類)
在Java中變量如果沒有初始化,會直接報錯,而不是像C/C++為隨機值
接下來我們每個基本類型挨個舉例
(1)整型(int)——4字節
public static void main1(String[] args) {//這樣可以把其他的main方法注釋掉int a = 10;System.out.println(a);System.out.println(Integer.MAX_VALUE);System.out.println(Integer.MIN_VALUE);}
我們要打印整型的最大值需要使用Integer方法中的MAX_VALUE和MIN_VALUE這兩個功能
?(2)長整型(long)——8字節
public static void main(String[] args) {//這里也是一樣,可以通過這種方式注釋掉long num1 = 10L;System.out.println(num1);System.out.println(Long.MAX_VALUE);//wow,打印長整型的最大值和最小值直接用首字符大寫的Long呀System.out.println(Long.MIN_VALUE);}
推薦大寫的L啦,小寫的也可以,但是小寫的經常被誤認為數字1啦
同理我們打印最值,使用Long方法中的MAX_VALUE和MIN_VALUE這兩個功能
(3)短整型(short)——2字節
public static void main(String[] args) {short num2 = 32767;System.out.println(num2);System.out.println(Short.MAX_VALUE);//原來短整型也是這么個包裝名System.out.println(Short.MIN_VALUE);}
?打印最值,使用Short方法中的MAX_VALUE和MIN_VALUE這兩個功能
(4)字節類型)byte——1字節
public static void main(String[] args) {byte num3 = 127;//哇塞,byte類型表示的范圍真的很小呢System.out.println(num3);System.out.println(Byte.MAX_VALUE);//這個也是一樣的包裝名呢System.out.println(Byte.MIN_VALUE);}
?打印最值,使用Byte方法中的MAX_VALUE和MIN_VALUE這兩個功能
為什么我們給四種變量?
這是為了合理運用空間,分配空間?
(5)雙精度浮點型(double)——8字節
public static void main(String[] args) {int simple1 = 1;int simple2 = 2;System.out.println(simple1 / simple2);//輸出0double num4 = 1.0;//小數默認是double型double num5 = 2.0;//當然這里的兩個num數據寫1和2也可以,相除后仍是0.5System.out.println(num4 / num5);System.out.println(Double.MAX_VALUE);//可以看到是一個科學計數法System.out.println(Double.MIN_VALUE);}
為什么兩個整型相除是0呢?這是因為執行整數除法的時候,舍棄小數部分
如果你想得到小數,可以使用double類型進行計算,算出的結果就是你想要的小數啦
打印最值,使用Double方法中的MAX_VALUE和MIN_VALUE這兩個功能,數字比較大
(6) 單精度浮點型(float)——4字節
public static void main(String[] args) {float num6 = 12.5f;float simple3 = 1.0f / 3.0f;double simple4 = 1.0 / 3.0;System.out.println(simple3);//結果是0.33333334System.out.println(simple4);//結果是0.3333333333333333System.out.println(Float.MAX_VALUE);System.out.println(Float.MIN_VALUE);}
對于float類型數據,我們結尾要加上f來強調
如果不寫,默認是double類型,大空間類型存入小空間類型,有數據丟失風險
那么float和double都可以表示小數,那它們有什么區別呢
double類型更大,說明它精度更高,能夠存儲更精確小數
打印最值,使用Float方法中的MAX_VALUE和MIN_VALUE這兩個功能
(7)字符型(char)——2字節
public static void main(String[] args) {char ch = 'A';char ch2 = '早';char ch3 = 97;System.out.println(ch);System.out.println(ch2);//注意char類型的包裝名是CharacterSystem.out.println(Character.MAX_VALUE);System.out.println(Character.MAX_VALUE);System.out.println(ch3);//打印的就是Unicode編碼里的97對應的字符}
?Java中的char類型與C/C++不同,它是有兩個字節大小,那就說明它可以存入更多字符,包括中文漢字哦,而且它沒有符號位,說明都是正數
它采用Unicode編碼,具體可以去這個網站看看→youyoy第三方網站對于Unicode編碼匯總
它表示的范圍比ASCII編碼范圍更大,而且它包含ASCII編碼
打印最值,注意這里的方法名是Character中的MAX_VALUE和MIN_VALUE這兩個功能
但是你會發現打印不出來,這是因為有些字符是不可打印字符
(8)布爾類型(boolean)——未明確大小
public static void main(String[] args) {boolean sign1 = true;boolean sign2 = false;//boolean simple5 = sign1+sign2;//這行代碼直接報錯System.out.println(sign1);System.out.println(sign2);}
注意在Java中不存在true表示1,false表示0的用法
打印輸出也只是打印輸出true和false,并且還不能進行加減
如果運行我注釋那一行的代碼,會直接報錯的
一般布爾類型都是未明確大小的,但是在oracle虛擬機中默認定義為1字節
?
?
八、類型轉換
分為自動類型轉換(隱式)和強制類型轉換(顯示),分別是編譯器自動和人為主動
(1)自動類型轉換
public static void main(String[] args) {int num7 = 5;long num8 = num7;//這里就把5從整型轉換成長整型float f = 12.5f;double fPro = f;//這里就把12.5從float類型轉換成double類型System.out.println(num8);System.out.println(fPro);}
針對的是小的類型轉成大的類型,比如示例中的int轉double,float轉double
(2)強制類型轉換
public static void main(String[] args) {double num9 = 12.12345678;float num10 = (float) num9;System.out.println(num10);byte num11 = (byte) 128;System.out.println(num11);
}
針對的是大的類型轉小的類型,比如示例中的double轉float
但是會存在一個問題,由于float只能精確到小數點6位,當發生強制類型轉換的時候,會產生數據丟失的風險
還有一個問題,如果你強制轉換的數在轉換后的類型中超出范圍了會發生什么?
就比如我上面示例代碼中的byte類型,結果我們看到是-128,為什么呢?
這里就涉及到了數據溢出的原理
你把它想象成一個鐘表,當你超過范圍了溢出的數據指向溢出的方向,進入溢出區域的范圍
?九、整型提升
public static void main(String[] args) {int num12 = 20;long num13 = 40;long ret = num12 + num13;System.out.println(ret);byte num14 = 10;byte num15 = 30;int ret2 = num14 + num15;System.out.println(ret2);//但是你想強行轉換也可以,但可能產生數據丟失問題(數據超出類型范圍的時候)byte ret3 = (byte) (num14 + num15);System.out.println(ret3);}
什么時候發生整型提升呢,當一個小的類型和一個大的類型進行加減運算時,由于小的類型數據范圍比較小,不方便統一運算,因此就提升為數據類型較大的那一個,對應的就用數據較大的那個類型來接收
如果同類型相加,假如數據類型小于int類型,則相加的時候先提升為int類型再進行計算
因為在進行加減運算時,CPU運算邏輯要求這樣
十、字符串類型
public static void main(String[] args) {String str1 = "hello world ";System.out.println(str1);String str2 = "hello everyone";String ret4 = str1 + str2;System.out.println(ret4);//hello world hello everyoneint num16 = 10;int num17 = 40;System.out.println(str2 + num16 + num17);//hello everyone1040System.out.println(num16 + num17 + str2);//50hello everyoneSystem.out.println(str2 + (num16 + num17));//hello everyone50}
?大部分跟C/C++邏輯類型,但是有一點比較特殊
在Java中,字符串之間使用加號,表示拼接的意思
但是有個細節需要我們注意,+確實是在字符串中表示拼接作用
但是如果你+號兩側中字符串類型的位置不一樣,會導致結果不同
為什么兩者的情況不同呢?
原來是字符串變量在前面,執行拼接指令,在后面則等前面的變量值執行完了,再執行后面
但如果你就是向字符串在前的時候拼接上比如變量相加的結果呢?很簡單,加個括號就可以了
?##與其他類型的轉換
public static void main(String[] args) {int num18 = 10;String str3 = num18 + "";System.out.println(str3);System.out.println(String.valueOf(num18));//這樣也可以強制轉換//String轉intString strOther = "hello world";int otherInt = Integer.parseInt(strOther);}
int轉string,我們可以給字符的結果加上“”或者是使用Srring方法中的valueof功能
反之string轉int,目前我認知的只能使用Integer方法中的parseInt功能
而且這種轉換編譯器也會報出警告
十一、運算符簡略介紹
(1)Java特殊介紹
例子一:
public static void main(String[] args) {int num19 = 50;int num20 = 0;//System.out.println(num19/num20);System.out.println(11.0 % 2.0);//結果是1.0}
?上面的num19/num20這段代碼會報錯
因為num20是一個0的值,計算異常,也就是0不能作為除數
Java中有一種特殊求余的方式,小數點求余,這是在C/C++中所沒有的
例子二:
在C語言中,這段代碼:3<num22<5的最終結果是true為真,但是在Java中無法通過編譯
這是因為第3<5判斷后,返回的類型是true
而true和5不是同一個類型,無法比較,Java中對類型的檢查非常嚴格
(2)增量運算符問題
public static void main(String[] args) {int num21 = 10;num21 += 1.5;System.out.println(num21);//為何打印的結果是11呢?}
?因為你num21是一個整型類型,你加上一個1.5相當于是double類型,10會發生整型提升
計算后的結果本應該是11.5,但是你的num21是int類型
會進行強制轉化,舍棄小數部分,不會四舍五入,因此上述計算式子等同于
num21 = (int) (num21 + 1.5);System.out.println(num21);//這里的打印結果就是12了
(3) 短路求值
public static void main(String[] args) {int num22 = 4;int num23 = 2;boolean ret5 = num22 > num23 && 1 > 2;System.out.println(ret5);//打印結果是false,因為兩邊同時為真整個式子才為真boolean ret6 = num22 > num23 || 1 > 2;System.out.println(ret6);//打印結果為true,只要兩邊有一邊為真整個式子就是真//針對程序拋出異常,我們使用短路來確保安全boolean retError3 = num22 > num23 || (1 / erroSimple) > 2;System.out.println(retError3);//輸出為true,右邊式子不會計算,不會執行右邊的拋出異常
但是在Java中,如果是按位與和按位或,則不會短路,會產生程序拋出異常
為了避免這種情況,我們善于利用短路來確保我們代碼安全
int erroSimple = 0;
boolean retError = num22>num23&(1/erroSimple)>2;//如果你不使用短路,會發生程序拋出異常//報錯信息→→Exception in thread "main" java.lang.ArithmeticException: / by zero
boolean retError2 = num22>num23|(1/erroSimple)>2;//同理會發生程序拋出異常,Exception in thread "main" java.lang.ArithmeticException: / by zero
System.out.println(retError);
System.out.println(retError2);
十二、位運算符
位運算符之前在C語言中已經計算過了,這里不做過多介紹,這里舉一個例子來看看
但是在Java中有一種特殊的右移,無符號右移,就是右移后甭管你是正數還是負數,一律添上0
public static void main(String[] args) {int num24 = 0xf;//這是十六進制數字,f代表15int ret7 = ~0xf;System.out.println(ret7);//誒,打印結果是-16,為什么呢?取反是按原碼取反//同樣移位操作符也講過,這里我舉一個特殊例子int num25 = -1;int ret8 = num25 >> 1;System.out.println(ret8);//結果還是-1//以下是Java獨有的無符號右移int ret9 = num25 >>> 1;System.out.println(ret9);//結果是2147483647,一個非常大的數}
以下是利用deepseek進行解讀為什么打印結果是-16,注意紅框框里的字“絕對值”?
以下是利用deepseek進行解讀為什么ret9是一個非常大的數
十三、條件操作符&&運算符優先級
public static void main(String[] args) {int ret10 = 1 > 0 ? 2 : 4;//問號左邊式子必須是布爾類型的判斷System.out.println(ret10);}
?跟C語言有些類似,但是這個操作符的值必須是有其他值去接收結果值來接收
至于優先級,與其記那么多規則,
還不如直接添加括號,想讓哪個部分先算就把哪個部分加括號即可
本文章所用代碼:Git碼云倉庫鏈接
作者水平有限,文章難免有些疏漏錯誤,歡迎指正,我們友好交流
END