1. JavaSE入門

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捕透。圖解:

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è)面虎谢。

之后在Java SE的頁(yè)面,點(diǎn)擊下載的圖標(biāo)曹质,出現(xiàn)下面界面婴噩,要按照?qǐng)D中所示操作擎场,即接受協(xié)議再下載符合自己電腦的版本:

下載完后,點(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è)置”:

在新界面中(默認(rèn)“高級(jí)”選項(xiàng)卡),點(diǎn)擊“環(huán)境變量”按鈕:

新界面顯示的內(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ú)效:

但是,一些系統(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目錄惑畴,但是前面說過,我們一般把自行配置的變量配置到用戶變量中航徙。

在原有路徑之后添加自己的路徑如贷,注意路徑之間用英文半角分號(hào)隔開!

然后點(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++這款文本編輯器玛荞。

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)存圖理解:

還可以這樣進(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ù)的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梗顺,一起剝皮案震驚了整個(gè)濱河市泡孩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寺谤,老刑警劉巖仑鸥,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吮播,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門救斑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摄职,你說我怎么就攤上這事』窳校” “怎么了谷市?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)击孩。 經(jīng)常有香客問我迫悠,道長(zhǎng),這世上最難降的妖魔是什么巩梢? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任创泄,我火速辦了婚禮,結(jié)果婚禮上括蝠,老公的妹妹穿的比我還像新娘鞠抑。我一直安慰自己,他們只是感情好忌警,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布搁拙。 她就那樣靜靜地躺著,像睡著了一般法绵。 火紅的嫁衣襯著肌膚如雪箕速。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天朋譬,我揣著相機(jī)與錄音盐茎,去河邊找鬼。 笑死徙赢,一個(gè)胖子當(dāng)著我的面吹牛庭呜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播犀忱,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼扶关!你這毒婦竟也來了阴汇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤节槐,失蹤者是張志新(化名)和其女友劉穎搀庶,沒想到半個(gè)月后拐纱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哥倔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年秸架,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咆蒿。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡东抹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沃测,到底是詐尸還是另有隱情缭黔,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布蒂破,位于F島的核電站馏谨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏附迷。R本人自食惡果不足惜惧互,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喇伯。 院中可真熱鬧喊儡,春花似錦、人聲如沸艘刚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)攀甚。三九已至箩朴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秋度,已是汗流浹背炸庞。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荚斯,地道東北人埠居。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像事期,于是被迫代替她去往敵國(guó)和親滥壕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法兽泣,類相關(guān)的語(yǔ)法绎橘,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法唠倦,異常的語(yǔ)法称鳞,線程的語(yǔ)...
    子非魚_t_閱讀 31,630評(píng)論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理涮较,服務(wù)發(fā)現(xiàn),斷路器冈止,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • Java8張圖 11狂票、字符串不變性 12、equals()方法熙暴、hashCode()方法的區(qū)別 13闺属、...
    Miley_MOJIE閱讀 3,702評(píng)論 0 11
  • 半夜醒來,正好看到博雅大師兄推送的一篇文章《我只想把自己廢掉——12歲女孩的自白》http://www.jians...
    冠世墨玉yanzi閱讀 205評(píng)論 2 2
  • 雖然不知道你是誰(shuí)怨咪,但是謝謝你讓我知道你一直都在...... 前幾天回了老家屋剑,室友說晚上有人在外頭敲門,問是誰(shuí)卻沒有...
    迷路路閱讀 180評(píng)論 0 0