【Java】基础知识整理
寫在前面
吹了這么久Python,怎么說也得照看照看老本行——Java吧,那就來吧。
比較起繼續研究一些艱深的知識,我更愿意暫時的回顧一些自己在成長路上遺漏的或者遺忘的小知識,所以有了這個系列的博文。
OK,我將開始新的旅程了,這個過程可能不會特別連續,但我會盡力堅持的!
切入正題
1.Java設計團隊設計Java考慮的關鍵術語
- Simple(簡單):Java有一系列簡潔、統一的功能,使其易于學習和使用。
- Secure(安全):Java提供了創建Internet程序的安全方法。
- Portable(可移植):Java程序可以在任何具有Java運行時系統的環境(JRE)中執行。
- Object-Orient(面向對象):Java代表了現代的面向對象編程理念。
- Robust(健壯):Java通過進行嚴格的輸入和執行運行時錯誤檢查,提倡無錯程序設計。
- Multithreaded(多線程):Java提供對多線程程序設計的集成支持。
- Architecture-Neutral(體系結構中立):Java并不局限于特定的計算機或者操作系統體系結構。
- Interpreted(解釋型):通過支持Java字節碼,Java支持跨平臺代碼。
- High Performance(高性能):Java字節碼的執行速度被高度優化。
- Distributed(分布式):Java被特意設計用在Internet的分布式環境中使用。
- Dynamic(動態):Java程序帶有大量在運行時用于檢查和解決對象訪問的運行時類型信息。
2.基本的代碼格式:
格式A:
public class Demo {//空四格(不要混用Tab和Space,除非你改了IDE設置) }格式B:
public class Demo {//空四格(不要混用Tab和Space,除非你改了IDE設置) }這兩種是我見過比較常見的了,其實我開始學習Java的時候是用的格式B,這種格式對齊明顯,但是后來我還是逐漸傾向于格式A,因為節省了不必要的行數且寫起來更加流暢。
這個自己習慣哪個,合理使用就行。
格式習慣還是應該有的,畢竟要代碼的格式優雅,可讀性也會好很多啊!
3.短路與不短路了解一下就行,那種東西,我相信有用!雖然我懂,但是我是沒太區分用過。
4.變量的作用域和生命周期看似很簡單但是后來竟然有點混淆,所以這里再扯一扯:
作用域內聲明的變量對于作用域之外的代碼是不可見(不可訪問)的。
因此,在聲明一個變量的時候,就將這個變量局部化了,并且防止它受到未授權的訪問或修改。
實際上,正是這種作用域規則提供了封裝的基礎。
代碼塊中聲明的變量被稱為局部變量。
作用域可嵌套,至于誰能訪問誰,依據上文自己理解一下就行。
值得一說的是,在代碼段末尾聲明一個變量是沒有意義的,因為沒有變量可以訪問它。
還需要記住:變量在進入作用域時創建,離開作用域時被銷毀。
這就意味著變量一旦離開作用域就不會存儲原來的值。
因此,方法調用期間,方法中聲明的變量值是無法保存其值的,而且在代碼塊中聲明的變量在離開此代碼塊中也會失去它的值。
因此,變量的生命周期被限制在作用域內。
5.基本類型的變量支持自動類型轉換的條件:
- 兩種類型兼容。
- 目標類型比源類型大。
6.Java表達式可以使用適當的空格來提升可讀性!
7.Java中,以整數為例:
123456789可以這么寫:123_456_789,這樣就提升了可讀性,讀者不需要一個一個敲著屏幕去數。
8.Scanner輸入方法以外的Java獲取鍵盤輸入的策略:
import java.io.IOException;public class Test {public static void main(String[] args) {System.out.println("請輸入一個數字");try {int num = (int) System.in.read();} catch (IOException e) {e.printStackTrace();}} }反正我是沒用過,感覺還是Scanner用著舒服。
9.什么時候能用if…else if…else卻不能用switch?(個人總結)
- 變量類型不同。
- 變量/對象類型不被switch支持。
- 變量的值是連續的而不是離散的。
10.Java中的switch語句支持什么類型?
byte、short、int、long、char、enum、String(JDK7+),是吧?
錯!
long不行!!!
11.foreach循環跟iterator有啥區別?
foreach其實就是iterator,編譯的時候就基本一樣。
所以性能效率差不多的。
自己寫的數據結構想用foreach,就必須實現Iterator接口!!!人家Java內置的數據結構咱們能用,還不是因為人家都處理好各種麻煩的東西了嘛……
注意,官方好像叫enhanced for(增強型for循環),別只知道foreach,那是自己人稱呼著玩的。
12.for循環可以缺失部分要素,但是;;至少不能缺。
for (;;) {}上面的代碼也行……只不過和
while(true) {}一樣,死循環…………
13.這個do-while循環,我是真用不慣,可是怎么有的大佬就用的那么溜呢?自閉……感興趣的自己研究研究,反正道理很容易懂,就是那種思維模式切不切的過來就不知道了。
14.Java沒有goto,但是把這個詞當了一個保留字(無意義但不能私自使用)……
沒有goto是好的,可以防止那種“意大利面條”式的語法。
其實呢選擇語句和循環語句這些程控語句真的是goto,只不過可讀性好。
嗯,匯編里是有goto那種東西的……
當然,goto是非結構化的;而break這種語句提供了更好的方式,因為它保留了一些結構化的特征。
return、break、continue這幾個語句合理使用其實挺有意思的。
15.差點忘了Java10+的var語法,堪稱神奇。
//a是浮點,默認double var a = 1.0; //b是整型,默認int var b = 100; //c是字符串,默認String var c = "Hello"; //......巨神奇的東西,可以作為局部變量,可以用作for循環的類型……
有著JavaScript的形式,還有著Python的靈魂,更是高舉我Java大旗,牛!
我也迷戀過這個var語法,用起來太爽了!
但是這個語法是有限制的:
- 每次只能聲明一個變量。
- 初始化時不能使用null。
- 初始化器表達式不能使用正在聲明的變量。
- 雖然可以使用var聲明數組類型,但不能將var與數組初始化器一起使用。
- var不是官方的關鍵字但也差不多,我的支持JDK11的Eclipse里面var會變色。所以var不能做類名、其他引用類型的名稱(包括接口、注解、枚舉等都算),用作變量名也要悠著點。
- 局部變量類型推斷不能用于catch捕獲的異常類型。
- 在lambda表達式和方法引用不能用作初始化器。
- …
但是還是省事啊,用一次就真香的東西……
另外——對于第四點,做一下解釋:
var arr = new int[10]; var arr = {1, 2, 3};第一段代碼是對的,第二段代碼是錯的。
然后談談var這個東西我的看法:
還是不要隨便用的好。
主要理由:
- var只受到JDK10+支持,現在JDK8還是用的太多,一旦遷移,基本“暴斃”。
- var的語法其實可讀性沒那么好,特別是等過一段時間,你再看可能會很困惑,因為滿屏橙色的var,很難懂。
- 限制那么多,用一會兒var,用一會兒類型,不太好受吧?
- ……
16.三目運算符和位運算符其實向我這種lj用的就不是很好,但是看看Java的源代碼吧,用的很強,所以有能力的大佬還是學一學吧,不用肯定不熟練。(三目我偶爾還是用的,只是這位運算符……苦澀啊……)
17.varargs很有意思,這個可變長的形參列表很靈活。
這個語法和數組參數也有一些相似之處和不同之處,此處不加贅述,感興趣可以查資料。
我想說的是,這個可變長的varargs在碰到重載時挺被動,畢竟會優先執行定長參數的方法。
調用下面語句:
yyy(1);會執行方法二,而方法一就不會被執行。
18.面向對象是Java SE學習(特別是入門)真正的核心,相關的代碼可以看這里:
面向對象
19.有關Java數組的注意事項
Java數組
20.Java異常處理的一些內容
Java異常注意事項
Java異常例子
Exception體系
21.別瞧不起選擇結構,學藝不精的初學者也可能掉進坑里:
Java選擇結構的坑
22.命令行參數
命令行參數
23.用用break吧
不用break的危害
24.this關鍵詞
this
25.static的使用不當是很多初學者的問題。
靜態變量不能訪問非靜態變量,這個問題的探討很有意思,簡單的講:
- 必須先初始化類,再初始化對象。然而做個比較極端的例子:對象沒初始化而類初始化的時候怎能隨意允許類的成員訪問對象的成員?
- static稱為“靜態”純粹因為翻譯的緣故,其實Java里static表示這個成員只屬于類而不專屬于某個對象。
這里暫時不深入探討,需要強調的是:Java面向對象,在設計的時候要考慮清楚你的設計在面向對象里的合理性,切莫濫用。
總結
以上是生活随笔為你收集整理的【Java】基础知识整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java】猜数字小游戏
- 下一篇: 并非最边界的情况“OK“就真的“OK“(