Java學(xué)習(xí)文檔
1 基礎(chǔ)知識(shí)
1.1 軟件
軟件就是計(jì)算機(jī)數(shù)據(jù)與指令的集合够掠。軟件 = 數(shù)據(jù) + 指令 + 文檔碳默。
軟件的目的是提高人與計(jì)算機(jī)交流的效率挠日,方便人與機(jī)器交互。
1.2 常用命令
現(xiàn)在人機(jī)交互的方式分為圖形化界面交互和命令式交互弧关。
圖形化界面簡(jiǎn)單直觀盅安,容易操作;使用命令的方式需要記住命令世囊,操作麻煩别瞭。
但是在程序開發(fā)中,使用命令更加高效株憾,有時(shí)使用一條命令就能完成若干的操作蝙寨。我們也需要學(xué)些簡(jiǎn)單的命令。
在Windows中執(zhí)行命令需要在CMD窗口中輸入命令。打開控制臺(tái)的方法:Windows + R鍵籽慢,輸出cmd并回車浸遗。
常用的DOS命令:
> 盤符: :進(jìn)入指定的盤符。
> dir:列出當(dāng)前目錄下文件和文件夾
> md:創(chuàng)建目錄
> rd:刪除目錄箱亿,不能刪除非空的文件夾
> cd:進(jìn)入指定目錄跛锌,cd ..表示退回上一級(jí),cd \表示退回到根目錄届惋。
> echo "hello java" > a.txt:將文本寫入到指定文件髓帽,將會(huì)創(chuàng)建文件
> type a.txt:顯示文件內(nèi)容
> del:刪除文件
> exit:退出控制臺(tái)
> cls:清空屏幕
另外,在控制臺(tái)中可以用:
*和?通配符脑豹;按下tab進(jìn)行命令補(bǔ)全郑藏;上下方向鍵顯示歷史命令。
2 Java簡(jiǎn)介
Java是SUN (Stanford University Network瘩欺,斯坦福大學(xué)網(wǎng)絡(luò))公司于1995年推出的一門高級(jí)編程語(yǔ)言必盖。Java原是印度尼西亞爪哇島的英文名稱,因盛產(chǎn)咖啡而聞名俱饿。Java最初目標(biāo)在于家用電器等小型系統(tǒng)的編程歌粥,隨著市場(chǎng)的變化,Java著眼于網(wǎng)絡(luò)應(yīng)用的開發(fā)拍埠。
1995年5月失驶,JAVA語(yǔ)言誕生。
2004年9月枣购,J2SE 1.5發(fā)布嬉探,這是Java發(fā)展史上的一個(gè)里程碑。為了表示該版本的重要性棉圈,J2SE 1.5更名為Java SE 5.0涩堤。
2005年,JAVA版本正式分為JAVA EE(企業(yè)級(jí))迄损,JAVA SE(基礎(chǔ))和JAVA ME(嵌入式)定躏。我們現(xiàn)在學(xué)習(xí)的是Java SE账磺,以后要學(xué)Java EE芹敌。必須先學(xué)好Java SE基礎(chǔ)才能進(jìn)行Java EE或者Android應(yīng)用的開發(fā)。
2006年12月垮抗,Sun發(fā)布了Java 6.0氏捞。
2009年,Oracle(甲骨文公司)收購(gòu)了Sun公司冒版。即現(xiàn)在Java歸Oracle管理液茎。
2011年7月,Oracle發(fā)布了Java 7。
2014年捆等,甲骨文公司發(fā)布了Java 8正式版滞造。
2.1 Java的跨平臺(tái)特性
這里著重講Java的跨平臺(tái)特性,語(yǔ)音的其他特性就不講了栋烤,只能在學(xué)習(xí)中體會(huì)谒养。
跨平臺(tái)就是軟件的運(yùn)行不依賴于具體的操作系統(tǒng)。在一個(gè)操作系統(tǒng)下開發(fā)的應(yīng)用明郭,放到另一個(gè)操作系統(tǒng)下依然可以運(yùn)行买窟。而Java就具有這樣的特性,Java語(yǔ)言編寫成的程序在不同的OS上都可以運(yùn)行薯定,“一次編寫始绍,處處運(yùn)行”。
而C語(yǔ)言的跨平臺(tái)性就不好话侄,在Windows上編譯生成的C語(yǔ)言程序亏推,在Linux系統(tǒng)下是不能運(yùn)行的。至少也要將源代碼再編譯生成不同的目標(biāo)代碼年堆,況且径簿,不同OS的系統(tǒng)調(diào)用API不同,就更加大了跨平臺(tái)的難度嘀韧。
Java的跨平臺(tái)是通過JVM(Java Virtual Machine篇亭,Java虛擬機(jī))來實(shí)現(xiàn)的。
JVM相當(dāng)于是一個(gè)用軟件模擬的計(jì)算機(jī)锄贷。Java源程序會(huì)編譯成.class字節(jié)碼文件译蒂。.class字節(jié)碼文件由JVM解釋運(yùn)行。因此谊却,只要為每種操作系統(tǒng)提供不同的JVM柔昼,就能實(shí)現(xiàn)跨平臺(tái)。即JVM拿到的是同一個(gè)字節(jié)碼文件炎辨,由JVM適應(yīng)不同的OS捕透。圖解:
![](https://coding.net/u/romfan/p/JavaSEStudyDocumentation/git/raw/master/images/1/2-1.png)
3 搭建Java開發(fā)環(huán)境
開發(fā)Java需要安裝JDK,即Java開發(fā)工具(Java Development Kit)碴萧。JDK是整個(gè)Java的核心乙嘀,包括了Java運(yùn)行環(huán)境、Java工具和Java基礎(chǔ)類庫(kù)破喻。
3.2 安裝JDK
首先在Oracle官網(wǎng)https://www.oracle.com找到JDK下載頁(yè)面虎谢。
![](https://coding.net/u/romfan/p/JavaSEStudyDocumentation/git/raw/master/images/1/3-1.png)
之后在Java SE的頁(yè)面,點(diǎn)擊下載的圖標(biāo)曹质,出現(xiàn)下面界面婴噩,要按照?qǐng)D中所示操作擎场,即接受協(xié)議再下載符合自己電腦的版本:
![](https://coding.net/u/romfan/p/JavaSEStudyDocumentation/git/raw/master/images/1/3-2.png)
下載完后,點(diǎn)擊安裝程序進(jìn)行安裝几莽。安裝時(shí)注意選擇安裝路徑迅办,路徑中不要有空格和中文。安裝時(shí)章蚣,把“公共JRE”這個(gè)組建去掉礼饱,不予安裝,因?yàn)镴DK中已經(jīng)包含了JRE究驴,不再需要額外的JRE镊绪。
說明:JRE就是Java運(yùn)行時(shí)環(huán)境(Java Runtime Environment)。JRE用于支持運(yùn)行Java程序洒忧,包括JVM和運(yùn)行Java程序需要的核心類庫(kù)蝴韭。如果只是使用Java應(yīng)用的用戶,則只要安裝公共JRE即可熙侍。
3.2 JDK安裝目錄介紹
bin目錄:存放Java編譯器榄鉴、解釋器等工具。
db目錄:這里是JDK附帶的一個(gè)輕量級(jí)數(shù)據(jù)庫(kù)蛉抓,名叫Derby庆尘。
include目錄:存放調(diào)用系統(tǒng)資源的接口文件。
jre目錄:存放Java運(yùn)行環(huán)境文件巷送。
lib目錄:存放Java類庫(kù)文件驶忌。
src.zip文件:是JDK Java類的源碼。IDE會(huì)找到這個(gè)文件笑跛,以便在IDE中查看JDK源碼付魔。
3.3 配置環(huán)境變量
3.3.1 環(huán)境變量及其作用
環(huán)境變量用于存儲(chǔ)操作系統(tǒng)級(jí)別的變量。環(huán)境變量分為系統(tǒng)變量和用戶變量飞蹂,系統(tǒng)變量可被系統(tǒng)中的所有用戶共享使用几苍;而用戶變量只能被當(dāng)前用戶使用。因此每個(gè)用戶都能配置自己的用戶變量陈哑。用戶也能設(shè)置系統(tǒng)變量妻坝,但是建議將自行配置的環(huán)境變量放在自己的用戶變量中,這樣比較清晰惊窖,互不影響刽宪。
通過實(shí)踐表明環(huán)境變量能在系統(tǒng)中使用。首先查看下本機(jī)的環(huán)境變量:桌面 – 右鍵“此電腦” – 屬性爬坑,出現(xiàn)下面界面纠屋,點(diǎn)擊“高級(jí)系統(tǒng)設(shè)置”:
![](https://coding.net/u/romfan/p/JavaSEStudyDocumentation/git/raw/master/images/1/3-3.png)
在新界面中(默認(rèn)“高級(jí)”選項(xiàng)卡),點(diǎn)擊“環(huán)境變量”按鈕:
![](https://coding.net/u/romfan/p/JavaSEStudyDocumentation/git/raw/master/images/1/3-4.png)
新界面顯示的內(nèi)容就是本機(jī)的用戶變量和系統(tǒng)變量盾计。
我們可以用這里的變量售担,在Windows中環(huán)境變量的變量名不區(qū)分大小寫。比如用戶變量里的“TEMP”表示本用戶的臨時(shí)目錄署辉,在文件管理器地址欄中輸入%TEMP%回車就能進(jìn)入此目錄族铆。%變量名%就表示引用這個(gè)變量。同樣在控制臺(tái)中執(zhí)行echo %TEMP%也能顯示此路徑哭尝。
另外哥攘,還有一個(gè)用戶變量叫USERPROFILE,這個(gè)變量在界面中隱藏了材鹦。這個(gè)變量指向用戶的主目錄逝淹,用這個(gè)有時(shí)很方便。
3.3.2 Path環(huán)境變量
前面說JDK下的bin目錄是一些工具桶唐,我們需要使用栅葡。比如進(jìn)入該目錄下打開控制臺(tái),執(zhí)行java命令會(huì)有一系列使用命令的提示尤泽。但是如果不在此目錄下欣簇,該命令就無(wú)效:
![](https://coding.net/u/romfan/p/JavaSEStudyDocumentation/git/raw/master/images/1/3-5.png)
但是,一些系統(tǒng)命令坯约,無(wú)論在什么路徑下都能使用熊咽,比如calc(打開計(jì)算器)、diskpart命令等闹丐。
為了在其他路徑下也能使用JDK中的命令横殴,需要配置Path環(huán)境變量。
PATH變量是一個(gè)特殊變量卿拴,一旦把一個(gè)路徑添加到Path環(huán)境變量中滥玷,那么該目錄下的命令就能在控制臺(tái)的任意路徑下使用。系統(tǒng)命令就是在系統(tǒng)Path命令中設(shè)置了才能在任何地方使用的巍棱。
我們可以在系統(tǒng)變量的Path變量中添加上JDK\bin目錄惑畴,但是前面說過,我們一般把自行配置的變量配置到用戶變量中航徙。
![](https://coding.net/u/romfan/p/JavaSEStudyDocumentation/git/raw/master/images/1/3-6.png)
在原有路徑之后添加自己的路徑如贷,注意路徑之間用英文半角分號(hào)隔開!
![](https://coding.net/u/romfan/p/JavaSEStudyDocumentation/git/raw/master/images/1/3-7.png)
然后點(diǎn)擊確定到踏,并且下層界面也要依次點(diǎn)確定杠袱。
之后,需要重新啟動(dòng)控制臺(tái)窝稿,這時(shí)在任意路徑下都能使用java命令了楣富。
但是一般標(biāo)準(zhǔn)的做法是在系統(tǒng)變量中增加一個(gè)變量,名字叫“JAVA_HOME”伴榔,這個(gè)就是JDK的根目錄纹蝴,然后Path變量引用這個(gè)JAVA_HOME變量庄萎。這樣的設(shè)置有利于以后使用大多數(shù)IDE軟件,因?yàn)楹芏嘬浖?huì)先檢測(cè)JAVA_HOME這個(gè)變量塘安。
(1)首先在“環(huán)境變量”界面新建一個(gè)用戶變量糠涛,名叫“JAVA_HOME”,值是JDK根目錄兼犯。(以后的很多工具也最好配置工具的根目錄忍捡,都是以_HOME結(jié)尾。標(biāo)準(zhǔn)做法切黔。)
(2)然后添加Path環(huán)境變量(之前直接設(shè)置的JDK\bin可以刪除了)砸脊,值為“%JAVA_HOME%\bin”,就是指向JDK的bin目錄纬霞。這也說明了變量間可以相互引用凌埂,還用通過 “%變量名%”引用。
(3)點(diǎn)擊確定险领,然后重啟控制臺(tái)侨舆,即可使用java中命令了。
還需要了解一下命令搜尋的順序:
(1)首先在當(dāng)前目錄下尋找命令绢陌,如果找不到就尋找環(huán)境變量中的路徑挨下。
(2)先尋找用戶Path變量中的路徑,若找不到就尋找系統(tǒng)Path變量中的路徑脐湾。
3.3.3 設(shè)置臨時(shí)環(huán)境變量
用set命令可以查看或設(shè)置臨時(shí)變量臭笆,用法如下:
Set:查看所有環(huán)境變量信息。會(huì)整合用戶變量和系統(tǒng)變量秤掌,比如用戶變量和系統(tǒng)變量都有path變量愁铺。
Set 變量名:查看具體一個(gè)環(huán)境變量的值。
Set 變量名= :清空一個(gè)環(huán)境變量的值闻鉴。
Set 變量名=具體值:給指定變量定義具體值茵乱。
若想在原有環(huán)境變量值基礎(chǔ)上添加新值,則通過%變量名%引用原有值孟岛,然后加上新值再設(shè)置給該變量即可瓶竭。
例如給path環(huán)境變量加入新值
Set path=新值;%path%
注意:用set命令配置的環(huán)境變量只在當(dāng)前控制臺(tái)窗口有效,一旦窗口關(guān)閉渠羞,該臨時(shí)的配置就消失了斤贰,還會(huì)變?yōu)樽孕性O(shè)置的值,只是臨時(shí)起作用次询。
4 Java程序入門
4.1 編程前的準(zhǔn)備
我們首先用簡(jiǎn)單的工具寫Java代碼并編譯運(yùn)行荧恍。首先要了解純文本文件和簡(jiǎn)單的文本編輯器。
windows中自帶一個(gè)叫記事本的軟件屯吊,記事本保存文檔的格式是txt格式,就是英語(yǔ)text的縮寫。我們稱這種文件為“純文本文件”。這是因?yàn)榧兾谋疚募荒鼙4嫖谋緝?nèi)容,不能保存文本的樣式(雖然可以通過設(shè)置軟件來使看到的字體變大等)兜看。而docx(Microsoft Office)等文檔不僅能保存文本內(nèi)容,還能保存文本的各種復(fù)雜樣式郎笆。所以昌犹,docx和txt存儲(chǔ)同樣的文本內(nèi)容,docx文件比txt的大屉佳。而且docx文件無(wú)法用記事本打開谷朝,會(huì)亂碼,無(wú)法解析因?yàn)閐ocx有特定的格式武花。
因此圆凰,純文本文件就是這樣的文件:
1) 只有文本,沒有樣式体箕;
2) 用記事本等純文本編輯器可讀专钉,不是亂碼。
而源代碼都是純文本格式的累铅,里面只寫代碼內(nèi)容跃须,包括java源文件、html文件等等娃兽。只是我們編輯html時(shí)用文本編輯器菇民,而用戶使用html時(shí)是使用瀏覽器瀏覽的⊥洞ⅲ可以設(shè)置打開方式第练。
Windows自帶的記事本不太好用,我們使用Notepad++這款文本編輯器玛荞。
![](https://coding.net/u/romfan/p/JavaSEStudyDocumentation/git/raw/master/images/1/4-1.png)
4.2 第一個(gè)Java程序
首先選定一個(gè)目錄娇掏,創(chuàng)建一個(gè)純文本文件,叫Demo.txt勋眯。注意婴梧,一定要設(shè)置文件擴(kuò)展名為可見,因?yàn)槲覀円盐募U(kuò)展名改為Demo.java凡恍,否則擴(kuò)展名就是Demo.java.txt了志秃,是錯(cuò)誤的。
然后將Demo.txt改名為Demo.java嚼酝。并用Notepad++打開(右鍵用Notepad++打開)浮还。編寫如下內(nèi)容:
public class Demo {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
這段代碼的作用是在控制臺(tái)打印出“Hello World”,目前我們寫的都是控制臺(tái)程序闽巩。
Class用戶定義類钧舌,這是面向?qū)ο蟮膬?nèi)容担汤,先寫著。Demo類中有main方法洼冻,這是主方法崭歧,args是接收的命令行參數(shù),因?yàn)閰?shù)有多個(gè)撞牢,所以用字符串?dāng)?shù)組接收(Java中String表示字符串類)率碾。public static先這樣寫著,是面向?qū)ο蟮膬?nèi)容屋彪。System.out.println()作用是打印一行數(shù)據(jù)所宰。
通過上面的分析,發(fā)現(xiàn)Java也是類C語(yǔ)言畜挥,因此面向過程的大部分內(nèi)容都和C是一樣的仔粥,下面就帶過了。
4.3 程序的編譯和運(yùn)行
寫完了上面的代碼蟹但,需要將代碼進(jìn)行編譯并運(yùn)行躯泰,這時(shí)需要使用JDK\bin下的工具,如果不能使用這些工具的話华糖,則說明環(huán)境變量沒有配置好麦向。
(1)先用javac工具將源文件編譯成class字節(jié)碼文件。使用命令:
javac 源文件缅阳。例如此例中使用:javac Demo.java磕蛇。這樣就能得到字節(jié)碼文件。
(2)有了字節(jié)碼文件十办,就能運(yùn)行程序了秀撇。使用java工具運(yùn)行該字節(jié)碼。
java 字節(jié)碼文件名(不要加.class擴(kuò)展名)向族,例如:java Demo呵燕。
從上述看出,Java是先編譯成字節(jié)碼文件件相,然后由JVM解釋執(zhí)行字節(jié)碼文件再扭。由JVM解釋執(zhí)行保證了Java的跨平臺(tái)性。做下對(duì)比:
C語(yǔ)言是編譯型語(yǔ)言夜矗,直接編譯成目標(biāo)平臺(tái)的程序泛范,可直接運(yùn)行;
JavaScript是編譯型語(yǔ)言紊撕,不需編譯罢荡,直接由瀏覽器的JavaScript引擎解釋執(zhí)行。
5 Java面向過程編程的新知識(shí)
這里總結(jié)概述Java中編寫面向過程編程的注意點(diǎn),主要將新特點(diǎn)区赵,和C語(yǔ)言同樣之處不再多說惭缰。
5.1 命名規(guī)則和注釋
標(biāo)識(shí)符的命令不能是關(guān)鍵字,像class笼才、int漱受、float等都是關(guān)鍵字,另外骡送,還要遵循以下規(guī)則:
1. 標(biāo)識(shí)符由unicode字符(推薦英文)昂羡、數(shù)字(0~9)、下劃線(_)和美元符號(hào)($)組成各谚。
2. 不能以數(shù)字開頭
3. 嚴(yán)格區(qū)分大小寫
標(biāo)識(shí)符的命名規(guī)則要求“見名知意”紧憾。常用的命名規(guī)則:
1. 包(package)名:包其實(shí)就是文件夾到千,用于管理多個(gè)類昌渤,包名采用小寫,如:com.xzit.xdxy
2. 類或者接口:Pascal規(guī)范憔四,例如StudentInfo膀息。
3. 方法/變量名:camel規(guī)范,例如studentAge了赵。
4. 常量:若常量名是一個(gè)單詞潜支,則全部字母大寫,若是多個(gè)單詞柿汛,則全部字母大寫冗酿,中間用下劃線_隔開。
Java中的注釋:
//單行注釋
/…/ 多行注釋
文檔注釋: /** … */络断,這種注釋稍后再說明裁替。
注意多行注釋不能嵌套和注釋的調(diào)試作用。
5.2 數(shù)據(jù)類型
基本數(shù)據(jù)類型:
byte(1字節(jié)) 數(shù)值范圍:128~127
short(2字節(jié))
int(4字節(jié))
long(8字節(jié))貌笨,定義long類型弱判,可在數(shù)據(jù)后加上大寫字母L以便區(qū)分。
float(4字節(jié))锥惋,定義float類型昌腰,必須在數(shù)據(jù)后加上字母F或者f,否則浮點(diǎn)數(shù)默認(rèn)是double類型的膀跌,強(qiáng)轉(zhuǎn)成float會(huì)丟失精度遭商,因此報(bào)錯(cuò)。
double(8字節(jié))
char(2字節(jié)捅伤,unicode編碼)
boolean(1字節(jié))劫流,值只有true和false,布爾類型。
注意不要使用未初始化的變量困介。
不同進(jìn)制的數(shù)據(jù)在Java中的表示:
1. 二進(jìn)制:以0b開頭
2. 八進(jìn)制:以0開頭
3. 十六進(jìn)制:以0x開頭
Java中也能使用轉(zhuǎn)義字符大审。和C相同。
5.3 數(shù)據(jù)類型轉(zhuǎn)換
1.自動(dòng)類型轉(zhuǎn)換(隱式)
2.強(qiáng)制類型轉(zhuǎn)換(顯式):(變量類型)變量名座哩。注意可能會(huì)損失精度徒扶。
3.boolean類型不能轉(zhuǎn)換為其他的數(shù)據(jù)類型
下面是例子:
例1:
public class Demo {
public static void main(String[] args) {
short a = 1;
a = a + 1; // 錯(cuò)誤,因?yàn)閍先加1根穷,會(huì)自動(dòng)轉(zhuǎn)換成int類型
short b = 2;
b++; // 正確姜骡,其中隱含了一個(gè)強(qiáng)制轉(zhuǎn)換
}
}
例2:
public class Demo {
public static void main(String[] args) {
byte b1 = 3, b2 = 4, b3;
b3 = b1 + b2; // 錯(cuò)誤
/*
為什么byte b1 = 3不報(bào)錯(cuò),而將兩個(gè)byte相加再賦值給一個(gè)byte就會(huì)報(bào)錯(cuò)(僅限于byte類型)屿良?
byte b1 = 3是正常的圈澈,因?yàn)?在byte范圍內(nèi),賦值時(shí)直接將3作為byte類型給b1.
b3 = b1 + b2報(bào)錯(cuò)是 java 的機(jī)制導(dǎo)致的:
java在對(duì)byte類型運(yùn)算時(shí)尘惧,會(huì)將其轉(zhuǎn)換為int類型康栈,兩個(gè)int類型相加,賦值給byte類型肯定會(huì)報(bào)錯(cuò)的喷橙。
*/
byte a = 3 + 4;
// 這個(gè)不報(bào)錯(cuò)啥么。
// 3和4是常量,在編譯時(shí)編譯器就講3+4解析成常量7賦值給變量a了贰逾。
// 7在byte范圍內(nèi)悬荣,直接賦值,這是編譯器的優(yōu)化疙剑。
}
}
5.4 運(yùn)算符
(1)算術(shù)運(yùn)算符:加減乘除氯迂、取余、自增自減言缤。
例1:符號(hào)+還能用于連接字符串嚼蚀。加法符號(hào)+是從左向右結(jié)合,只要符號(hào)左右兩邊不都是數(shù)字轧简,就是連接字符串驰坊。語(yǔ)句System.out.println();用于輸出信息。
public class Demo {
public static void main(String[] args) {
System.out.println("hello" + 'a' + 1);
System.out.println('a' + 1 + "hello");
System.out.println("5 + 5 = " + 5 + 5);
System.out.println(5 + 5 + " = 5 + 5");
}
}
運(yùn)行結(jié)果:
helloa1
98hello
5 + 5 = 55
10 = 5 + 5
(2)取模后哮独,結(jié)果的正負(fù)取決于被除數(shù)拳芙。利用取余,可以判斷一個(gè)整數(shù)的奇偶等
例2:取余結(jié)果的正負(fù)號(hào)皮璧。
public class Demo {
public static void main(String[] args) {
System.out.println(-10 % 3); // -1
System.out.println(10 % -3); // 1
System.out.println(-10 % -3); // -1
}
}
例3:判斷整數(shù)奇偶舟扎。
public class Demo {
public static void main(String[] args) {
int num = 23;
if(num % 2 == 0) {
System.out.println(num + "是偶數(shù)");
} else {
System.out.println(num + "是奇數(shù)");
}
}
}
例4:如果今天是星期五,那么1000天后是星期幾悴务?
public class Demo {
public static void main(String[] args) {
int today = 5; // 今天周五
int after1000 = (today + 1000) % 7;
System.out.println("1000天后是周" + after1000);
}
}
(3)賦值運(yùn)算符=和復(fù)合運(yùn)算符睹限,比如sum += 1.
(4)比較運(yùn)算符的結(jié)果是boolean類型譬猫,只有true和false兩種結(jié)果。例如等于==羡疗,不等于!=染服,大于>,小于<叨恨,大于等于>=和小于等于<=柳刮。
(5)邏輯運(yùn)算符:與(&和&&,&&是短路與)痒钝,或(|和||秉颗,||是短路或),非(!)和異或(^送矩,即左右兩邊表達(dá)式都為true或false時(shí)蚕甥,結(jié)果為false,否則結(jié)果為true栋荸,即一個(gè)true一個(gè)false)
public class Demo {
public static void main(String[] args) {
System.out.println( (5 > 3) ^ (4 > 2) ); // 表達(dá)式均為true菇怀,結(jié)果為false
System.out.println( (5 > 3) ^ (4 < 2) ); // 結(jié)果為true
}
}
(6)位運(yùn)算符。&蒸其、|和^除了可以作為邏輯運(yùn)算符敏释,也可以作為位運(yùn)算符。位運(yùn)算是對(duì)兩個(gè)操作數(shù)中的每一個(gè)二進(jìn)制位都進(jìn)行運(yùn)算摸袁。另外,~是取反操作义屏,只有一個(gè)操作數(shù)靠汁。
一個(gè)數(shù)異或同一個(gè)數(shù)兩次,結(jié)果還是那個(gè)數(shù)闽铐,可以用這個(gè)規(guī)律進(jìn)行數(shù)據(jù)的加密蝶怔。
(7)移位操作符:左移<<,右移>>兄墅,無(wú)符號(hào)右移>>>(被移位二進(jìn)制最高位無(wú)論是0或者是1踢星,空缺位都用0補(bǔ))。
左移:被移除的高位丟棄隙咸,右邊空缺位補(bǔ)0沐悦。左移就相當(dāng)于乘以2的位移位數(shù)次冪。右移相當(dāng)于除以2的移動(dòng)位數(shù)次冪五督。
最有效率的方式算出2乘以8:2 << 3.
右移:被移位的二進(jìn)制最高位是0藏否,右移后,空缺位補(bǔ)0充包;若最高位是1副签,空缺位補(bǔ)1。
無(wú)符號(hào)右移:被移位二進(jìn)制最高位無(wú)論是0或者是1,空缺位都用0補(bǔ)淆储。
(8)三元運(yùn)算符
(9)優(yōu)先級(jí)冠场。使用括號(hào)能改變優(yōu)先級(jí)。
5.5 流程控制
流程控制還是:順序本砰、選擇和循環(huán)結(jié)構(gòu)慈鸠。使用的關(guān)鍵字的用法都是相同的灌具,可以使用if青团、else、switch咖楣、三元表達(dá)式督笆、do…while、while诱贿、for娃肿、break和continue。
switch語(yǔ)句的控制表達(dá)式的數(shù)據(jù)類型只能是byte珠十、short料扰、char、int(不能是long類型)焙蹭、枚舉類型和String類型(不能是StringBuffer或StringBuilder類型)晒杈。
例1:判斷輸入的月份有多少天】桌鳎【學(xué)習(xí)Scanner獲取用戶輸入和判斷閏年】
說明:獲取從鍵盤輸入的數(shù)據(jù)拯钻,需要用到Scanner類:
1. 導(dǎo)包:import java.util.Scanner;
2. 創(chuàng)建對(duì)象:Scanner sc = new Scanner(System.in);
3. 獲取int類型數(shù)據(jù):int x = sc.nextInt();
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
int userInput; // 記錄用戶輸入的數(shù)據(jù)
Scanner sc = new Scanner(System.in); // 用System.in創(chuàng)建Scanner對(duì)象
do {
System.out.println("請(qǐng)輸入月份:(輸入-1退出程序)");
userInput = sc.nextInt(); // 獲得輸入的年份
// 使用switch
switch(userInput) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println(userInput + "月有31天");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println(userInput + "月有30天");
break;
case 2:
System.out.println("請(qǐng)輸入年份");
int year = sc.nextInt();
int days = ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) ? 29 : 28;
System.out.println(year + "年" + userInput + "月有" + days + "天");
break;
case -1:
break;
default:
System.out.println("輸入月份錯(cuò)誤");
break;
}
} while(userInput != -1);
}
}
例2:猜數(shù)字游戲∽颍【學(xué)習(xí)生成隨機(jī)數(shù)】
說明:使用Math.random()方法能生成一個(gè)[0.0, 1.0)之間的隨機(jī)數(shù)粪般,現(xiàn)在想生成[1, 100]之間的隨機(jī)數(shù),則用式子:(int)(Math.random() * 100 + 1) 來生成污桦。每次運(yùn)行程序生成的數(shù)字是不一樣的亩歹,說明Math.random()是以當(dāng)前時(shí)間作為種子。
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int number = (int)(Math.random() * 100 + 1);
int userInput = number--; // 防止初始化數(shù)據(jù)與number一致
do {
System.out.println("請(qǐng)輸入你猜的數(shù)字:");
userInput = sc.nextInt();
if(userInput > number) {
System.out.println("猜的大了");
} else if (userInput < number) {
System.out.println("猜的小了");
} else {
System.out.println("猜中了凡橱!");
}
} while (userInput != number);
}
}
例3:跳出或者結(jié)束一個(gè)最內(nèi)層循環(huán)用break/continue小作,如果想跳出/結(jié)束多個(gè)循環(huán),則使用標(biāo)簽跳轉(zhuǎn)梭纹。break和continue都可以結(jié)合標(biāo)記使用:
public class Demo {
public static void main(String[] args) {
outer:
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 4; y++) {
break outer;
}
System.out.println("hello");
}
}
}
6 擴(kuò)展:用異或?qū)ξ募用?解密
import java.io.*;
public class Demo {
/**
* 由于加密和解密都是對(duì)目標(biāo)文件異或躲惰,因此,只有一個(gè)主程序变抽。
* @param args 定義此程序的參數(shù)1是輸入文件础拨,參數(shù)2是輸出文件
*/
public static void main(String[] args) throws IOException {
// 參數(shù)個(gè)數(shù)錯(cuò)誤提示
if(args.length < 2) {
System.out.println("請(qǐng)正確使用參數(shù)氮块!");
System.out.println("參數(shù)用法:");
System.out.println("參數(shù)1:輸入文件,參數(shù)2:輸出文件诡宗,參數(shù)3:加密/解密的數(shù)字");
System.out.println("例子:mypwd d:/1.txt d:2.txt 21");
return;
}
String inFilePath = args[0];
String outFilePath = args[1];
int code;
try {
code = Integer.parseInt(args[2]);
} catch (Exception e) {
System.out.println("加密/解密的密碼必須是數(shù)字");
return;
}
// 根據(jù)路徑創(chuàng)建文件
File inFile = new File(inFilePath);
File outFile = new File(outFilePath);
// 輸入文件不存在提示
if(!inFile.exists()) {
System.out.println("文件: \"" + inFilePath + "\" 不存在");
}
// 根據(jù)File對(duì)象創(chuàng)建輸入和輸出流
FileInputStream input = new FileInputStream(inFile);
FileOutputStream output = new FileOutputStream(outFile);
// 讀取到就把數(shù)據(jù)異或
int content = 0;
while((content = input.read()) != -1) {
// 異或到輸出流
output.write(content ^ code);
}
// 關(guān)閉資源
output.close();
input.close();
}
}
7 方法
7.1 方法的格式
Java中的方法就是函數(shù)滔蝉,Java中函數(shù)不需要在使用之前聲明,直接定義即可使用塔沃。Java中方法的格式:
修飾符 返回值類型 方法名(參數(shù)類型和參數(shù)名)
現(xiàn)在的階段我們使用的修飾符就是public static蝠引。
7.2 方法的重載
在同一個(gè)類中,有一個(gè)以上的同名函數(shù)蛀柴,只要函數(shù)的參數(shù)列表或參數(shù)類型不一樣即可螃概,與返回值無(wú)關(guān), 這些統(tǒng)稱為方法的重載鸽疾。
方法的重載讓我們可以定義重名的函數(shù)吊洼。
8 數(shù)組
8.1 數(shù)組的定義
定義的格式:
type[] arrayName;
type表示數(shù)組存儲(chǔ)的數(shù)據(jù)類型,arrayName是數(shù)組名稱制肮。比如:
int[] arr;
表示的是定義了一個(gè)int類型的數(shù)組冒窍,數(shù)組名是arr,該數(shù)組存儲(chǔ)int類型數(shù)據(jù)豺鼻。
8.2 數(shù)組的初始化
數(shù)組的初始化有兩種方法综液,根據(jù)需求來:
(1)int[] a = new int[3];
只指定長(zhǎng)度,系統(tǒng)給初始值儒飒。int類型初始值是0谬莹,String初始值是null。
(2)int[] a = {1, 2, 3}; 直接給數(shù)組賦值约素。
8.3 訪問數(shù)組元素和遍歷
訪問數(shù)組元素要注意數(shù)組越界問題:如果訪問數(shù)組時(shí)届良,索引值小于0或者大于等于數(shù)組的長(zhǎng)度,編譯時(shí)不會(huì)報(bào)錯(cuò)圣猎,但是會(huì)有運(yùn)行時(shí)異常:ArrayIndexOutOfBoundsException:N,N就是試圖訪問的數(shù)組索引乞而。
空指針異常(NullPointerException):當(dāng)一個(gè)對(duì)象為空null送悔,而使用這個(gè)對(duì)象時(shí),就會(huì)
產(chǎn)生空指針異常(運(yùn)行時(shí))爪模。數(shù)組是一種引用類型欠啤,比如數(shù)組沒有任何指向而訪問其元素就會(huì)有空指針異常。
數(shù)組的length屬性能得到該數(shù)組的長(zhǎng)度屋灌,就是數(shù)組中元素的個(gè)數(shù)洁段。常用這個(gè)和for循環(huán)來遍歷數(shù)組。
8.4 內(nèi)存分析
數(shù)組是引用類型共郭,Java在存儲(chǔ)基本類型(值類型)和引用類型變量時(shí)是不同的祠丝。
Java中有堆存儲(chǔ)和棧存儲(chǔ)疾呻。
棧存儲(chǔ)局部變量(方法中的變量)中的值類型和任何變量的變量名。局部變量使用完畢后就會(huì)釋放写半。
堆存儲(chǔ)new出來的東西岸蜗,然后把堆地址賦給棧中的變量。這樣棧中的變量名就引用了堆中的地址叠蝇。當(dāng)一個(gè)堆中的數(shù)據(jù)沒有引用時(shí)璃岳,Java的垃圾回收器(GC)就會(huì)回收并釋放資源。
可以畫圖解釋悔捶。以后的對(duì)象在內(nèi)存里面的存儲(chǔ)也是這樣的铃慷。
8.5 數(shù)組中的算法
在數(shù)組中可以練習(xí):查找最大值、排序等算法蜕该。這里實(shí)現(xiàn)一個(gè)二分查找法的算法實(shí)現(xiàn)犁柜。二分查找法的前提是這個(gè)數(shù)組是已經(jīng)從小打大排好序的。
public class Demo {
public static void main(String[] args) {
int[] arr = {11, 22, 33, 44, 55, 66};
System.out.println(myBinarySearch(arr, 3));
}
public static int myBinarySearch(int[] targetArr, int targetNum) {
int head = 0;
int end = targetArr.length - 1;
int middle = (head + end) / 2;
while(targetArr[middle] != targetNum) {
if(head > end) {
return -1;
}
if(targetNum > targetArr[middle]) {
head = middle + 1;
} else {
end = middle - 1;
}
middle = (head + end) / 2;
}
return middle;
}
}
就是如果不相等蛇损,就看這個(gè)中間的數(shù)和目標(biāo)值哪個(gè)大赁温,如果是中間的數(shù)大,那么目標(biāo)值在中間數(shù)的左邊淤齐,將尾指針移到中間數(shù)前面股囊,否則將頭指針移到中間數(shù)后面。如果某次頭指針比尾指針還靠后更啄,說明找不到這個(gè)數(shù)稚疹,返回-1.
8.6 二維數(shù)組
二維數(shù)組的每個(gè)元素就是一維數(shù)組。
二維數(shù)組舉例:int[][] arr = new int[m][n];
m表示這個(gè)二維數(shù)組有多少個(gè)一維數(shù)組
n表示每一個(gè)一維數(shù)組的元素個(gè)數(shù)祭务。例如int[][] a = new int[3][4].
內(nèi)存圖理解:
![](https://coding.net/u/romfan/p/JavaSEStudyDocumentation/git/raw/master/images/1/8-1.png)
還可以這樣進(jìn)行動(dòng)態(tài)分配:
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[3];
arr[2] = new int[4];
這樣的話内狗,可以使每行的一維數(shù)組元素個(gè)數(shù)不一致。也可以這樣初始化:
int[][] arr = { { 1 ,2 ,3 } , {4 ,5 }, { 6 } };
8.7 遍歷二維數(shù)組
直接看代碼:
public class Demo {
public static void main(String[] args) {
int[][] arr = {{1, 2, 3}, {4, 5}, {6}};
// 遍歷
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println(); // 換行
}
}
}
8.8 數(shù)組的特點(diǎn)
(1)數(shù)組只能存儲(chǔ)同一種數(shù)據(jù)類型的數(shù)據(jù)义锥。
×场(2)數(shù)組會(huì)給每個(gè)元素分配一個(gè)索引值,從0開始拌倍。
÷咐稹(3)數(shù)組一旦初始化,那么長(zhǎng)度就固定了柱恤。
∈酢(4)數(shù)組中的元素內(nèi)存地址是連續(xù)的。