Java --- 基础学习Ⅰ
第一章 開(kāi)發(fā)前言
位、字節(jié)
-
位(bit): 一個(gè)數(shù)字0或一個(gè)數(shù)字1,代表一位
-
字節(jié)(Byte): 每逢8位是一個(gè)字節(jié),這時(shí)數(shù)據(jù)存儲(chǔ)的最小單位
1 Byte = 8 bit
1 KB = 1024 Byte
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
1 PB = 1024 TB
MS-DOS(Microsoft Disk Operating System)
第二章 Java語(yǔ)言開(kāi)發(fā)環(huán)境搭建
2.1 Java虛擬機(jī)–JVM
- JVM(Java Virtual Machine): Java虛擬機(jī),簡(jiǎn)稱(chēng)JVM,是運(yùn)行所有Java程序的假想計(jì)算機(jī),是Java程序的運(yùn)行環(huán)境,是Java最具吸引力的特性之一。我們編寫(xiě)的Java代碼, 都運(yùn)行在JVM之上
- 跨平臺(tái): 任何軟件的運(yùn)行,都必須要運(yùn)行在操作系統(tǒng)之上,而我們使用Java編寫(xiě)的軟件可以運(yùn)行在任何的操作系統(tǒng)上,這個(gè)特性成為Java語(yǔ)言的跨平臺(tái)性。該特性是由JVM實(shí)現(xiàn)的,我們編寫(xiě)的程序運(yùn)行在JVM上,而JVM運(yùn)行在操作系統(tǒng)上
如圖所示,Java的虛擬機(jī)本身不具備跨平臺(tái)功能的,每個(gè)操作系統(tǒng)下都有不同版本的虛擬機(jī)
2.2 JRE和JDK
- JRE(Java Runtime Environment): 是Java程序的運(yùn)行時(shí)環(huán)境,保護(hù)JVM和運(yùn)行時(shí)所需要的核心類(lèi)庫(kù)
- JDK(Java Development Kit): 是Java程序開(kāi)發(fā)工具包,保護(hù)jre和開(kāi)發(fā)人員使用的工具
我們想運(yùn)行已有的Java程序,那么只需安裝JRE即可
我們想開(kāi)發(fā)一個(gè)全新的Java程序,那么必須安裝JDK
JRE = “運(yùn)行類(lèi)庫(kù)” + “JVM”
JDK = “編譯器等開(kāi)發(fā)工具” + JRE
2.3 安裝步驟
- 下載Java JDK 11 Windows 11.0.5
2.4 目錄說(shuō)明
安裝好Java之后,在安裝路徑D:\develop\Java\會(huì)生成一些文件夾.下面說(shuō)明各個(gè)文件夾的作用:
- bin: 存放了JDK的各種工具命令。(javac和java就放在這個(gè)目錄)
- conf: 存放了JDK的相關(guān)配置文件
- include: 存放了一些平臺(tái)特定的頭文件
- jmods: 該路徑下存放了JDK的各種模塊
- legal: 存放了JDK各模塊的授權(quán)文檔
- lib: 存放路JDK工具的一些補(bǔ)充JAD包
第三章 常見(jiàn)語(yǔ)法
1 常用DOS命令
| 盤(pán)符名稱(chēng) | 盤(pán)符切換。 E: 回車(chē),表示切換到E盤(pán) |
| dir | 查看當(dāng)前路徑下的內(nèi)容 |
| cd 目錄 | 進(jìn)入單級(jí)目錄. cd marron |
| cd… | 回退到上一級(jí) |
| cd 目錄1\目錄2\ … | 進(jìn)入多級(jí)目錄: cd itheima\JavaSE |
| cls | 清屏幕 |
| exit | 退出命令提示符窗口 |
2 path 環(huán)境變量的配置
開(kāi)發(fā)Java程序,需要使用JDK提供的開(kāi)發(fā)工具,而這些工具在JDK的安裝目錄的bin目錄下.
為了在開(kāi)發(fā)Java程序的時(shí)候,能夠方便的使用javac和java這些命令,我們需要配置Path環(huán)境變量
3. HelloWorld案例
3.1 Java程序開(kāi)發(fā)運(yùn)行流程
開(kāi)發(fā)Java程序,需要三個(gè)步驟: 編寫(xiě)程序,編譯程序,運(yùn)行程序
3.2 Hello World案例的編寫(xiě)
- 編譯
- 運(yùn)行
4. 略
5. Notepad軟件的安裝和使用(略)
6. 注釋(略)
- 單行注釋: //
- 多行注釋: /**/
- 文檔注釋: /** */
7. 關(guān)鍵字
-
關(guān)鍵字的特定:
-
關(guān)鍵字的字母全部是小寫(xiě)
-
常用的代碼編輯器,針對(duì)關(guān)鍵字有特殊的顏色標(biāo)記,非常直觀
- public class HelloWolrd{/*這是main方法main方法是程序的入口方法,代碼的執(zhí)行是從main方法開(kāi)始的*/public static void main(String[] args){System.out.println('marron')} }
-
8. 常量
-
常量的概述: 在程序運(yùn)行過(guò)程中,其值不可以發(fā)生改變的量
-
常量的分類(lèi):
-
常量類(lèi)型說(shuō)明舉例 字符串常 用雙引號(hào)括起來(lái)的內(nèi)容 “HelloWorld” 整數(shù)常量 不帶小數(shù)的數(shù)字 666,-88 小數(shù)常量 帶小數(shù)的數(shù)字 13.14,-5.21 字符常量 用單引號(hào)括起來(lái)的內(nèi)容 ‘A’,‘0’,’,‘我’ 布爾常量 布爾值,表示真假 只有兩個(gè)值: true, false 空常量 一個(gè)特殊的值,空值 值是null
-
9. 數(shù)據(jù)類(lèi)型
-
計(jì)算機(jī)的存儲(chǔ)單元: 我們知道就算機(jī)是可以用來(lái)存儲(chǔ)數(shù)據(jù)的,但是無(wú)論是內(nèi)存還是硬盤(pán),計(jì)算機(jī)設(shè)備的最小信息單元叫"位(bit)",我們又稱(chēng)之為"比特位",通常用小寫(xiě)的字母"b"表示。而計(jì)算機(jī)中最小的存儲(chǔ)單元叫"字節(jié)(byte)",通常用大寫(xiě)字母"B"表示,字節(jié)是由連續(xù)的8個(gè)位組成
-
Java語(yǔ)言是強(qiáng)語(yǔ)言類(lèi)型,對(duì)于每一種數(shù)據(jù)都給出了明確的數(shù)據(jù)類(lèi)型,不同的數(shù)據(jù)類(lèi)型也分配了不同的內(nèi)存空間,所以它們表示的數(shù)據(jù)大小也是不一樣的.
- 數(shù)據(jù)類(lèi)型:
- 基本數(shù)據(jù)類(lèi)型:
- 數(shù)值型:
- 整數(shù)(byte,short,int,long)
- 浮點(diǎn)數(shù)(float, double)
- 字符(char)
- 非數(shù)值型
- 數(shù)值型:
- 引用數(shù)據(jù)類(lèi)型:
- 類(lèi)(class)
- 接口(interface)
- 數(shù)組([])
- 基本數(shù)據(jù)類(lèi)型:
- 數(shù)據(jù)類(lèi)型:
-
數(shù)據(jù)類(lèi)型內(nèi)存占用和取值范圍
| 整數(shù) | byte | 1 | -128~127 |
| 整數(shù) | short | 2 | -32768~32767 |
| 整數(shù) | int | 4 | -2^31 ~ 2^31 -1 |
| 整數(shù) | long | 8 | -2^63 ~ 2^63 -1 |
| 浮點(diǎn)數(shù) | float | 4 | 負(fù)數(shù): -3.402823E + 38 ~ -1.401298E -45; 正數(shù): 1.401298E - 45 到 3.402823E + 38 |
| 浮點(diǎn)數(shù) | double | 8 | 負(fù)數(shù): -1.797693E + 308 ~ -4.9000000E - 324; 正數(shù): 4.900000000E - 324 到1797693E + 308 |
| 字符 | char | 2 | 0~65535 |
| 布爾 | boolean | 1 | true, false |
10. 變量
-
變量: 在程序運(yùn)行過(guò)程中,其值可以發(fā)生改變的量。 從本質(zhì)上講: 變量是內(nèi)存中的一小塊區(qū)域
-
格式: 數(shù)據(jù)類(lèi)型 變量名 = 變量值; (int a = 10)
-
變量使用的注意事項(xiàng):
- VariableDemo02.java:30: 錯(cuò)誤: 整數(shù)太大: 告訴計(jì)算機(jī)右邊的值是long類(lèi)型即可
- VariableDemo02.java:35: 錯(cuò)誤: 不兼容的類(lèi)型: 從double轉(zhuǎn)換到float可能會(huì)有損失: 告訴計(jì)算機(jī)右邊的是float類(lèi)型即可
11. 標(biāo)識(shí)符
- 標(biāo)識(shí)符: 就是給類(lèi),方法,變量等起名字的符號(hào)
- 標(biāo)識(shí)符定義規(guī)則:
- 由數(shù)字、字母、下劃線(_)和美元符($)組成
- 不能以數(shù)字開(kāi)頭
- 不能是關(guān)鍵字
- 區(qū)分關(guān)鍵字
- 常見(jiàn)命名約定:
- 小駝峰命名法:
- 標(biāo)識(shí)符是一個(gè)單詞的時(shí)候,首字母開(kāi)頭小寫(xiě), name
- 標(biāo)識(shí)符是多個(gè)單詞時(shí),第一個(gè)字母開(kāi)頭小寫(xiě),其他單詞首字母大寫(xiě), firstName
- 大駝峰命名法:
- 標(biāo)識(shí)符是一個(gè)單詞的時(shí)候,首字母開(kāi)頭大寫(xiě), Student
- 標(biāo)識(shí)符是多個(gè)單詞時(shí),每個(gè)單詞首字母大寫(xiě), GoodStudent
- 小駝峰命名法:
12. 類(lèi)型轉(zhuǎn)換
- 自帶類(lèi)型轉(zhuǎn)換:
- 把一個(gè)數(shù)據(jù)范圍小的數(shù)值或者變量賦值給另一個(gè)表示數(shù)據(jù)范圍大的變量: double d = 10
- 下面是表示數(shù)據(jù)范圍從小到大圖
-
常見(jiàn)報(bào)錯(cuò):
- ConversionDemo.java:15: 錯(cuò)誤: 不兼容的類(lèi)型: 從byte轉(zhuǎn)換到char可能會(huì)有損失: byte無(wú)法轉(zhuǎn)換位char
-
強(qiáng)制類(lèi)型轉(zhuǎn)換: 把一個(gè)表示數(shù)據(jù)范圍大的數(shù)值或者變量賦值給另一個(gè)表示數(shù)據(jù)范圍小的變量
- 格式: 目標(biāo)數(shù)據(jù)類(lèi)型 變量名 = (目標(biāo)數(shù)據(jù)類(lèi)型)值或者變量
- int k = (int)88.88
- ConversionDemo.java:18: 錯(cuò)誤: 不兼容的類(lèi)型: 從double轉(zhuǎn)換到int可能會(huì)有損失: int k = 88.88
- 格式: 目標(biāo)數(shù)據(jù)類(lèi)型 變量名 = (目標(biāo)數(shù)據(jù)類(lèi)型)值或者變量
13. 運(yùn)算符
-
運(yùn)算符: 對(duì)常量或者變量進(jìn)行操作的符號(hào)
-
表達(dá)式: 用運(yùn)算符把常量或者變量連接起來(lái)符合java語(yǔ)法的式子就可以成為表達(dá)式.不同運(yùn)算符連接的表達(dá)式體現(xiàn)的是不同類(lèi)型的表達(dá)式.
-
舉例子:
- int a = 10; int b = 20; int c = a + b;
-
+: 是運(yùn)算符,并且是算數(shù)運(yùn)算符
-
a+b: 是表達(dá)式,由于+是算術(shù)運(yùn)算符,所以這個(gè)表達(dá)式叫算數(shù)表達(dá)式
字符的"+"操作
拿字符在計(jì)算機(jī)底層對(duì)應(yīng)的數(shù)值來(lái)進(jìn)行計(jì)算的
- ‘A’ -> 65 (A-Z是連續(xù)的)
- ‘a(chǎn)’ -> 97 (a-z是連續(xù)的)
- ‘0’ -> 48 (0-9是連續(xù)的)
算數(shù)表達(dá)式中包含多個(gè)基本數(shù)據(jù)類(lèi)型的值的時(shí)候,整個(gè)算數(shù)表達(dá)式的類(lèi)型會(huì)自動(dòng)進(jìn)行提升,提升規(guī)則:
- byte類(lèi)型,short類(lèi)型和char類(lèi)型將被提升到int類(lèi)型
- 整個(gè)表達(dá)式的類(lèi)型自動(dòng)提升到表達(dá)式中最高等級(jí)操作數(shù)同樣的類(lèi)型,
- 等級(jí)順序: byte,short,char -> int -> ling -> float -> double
[報(bào)錯(cuò)]:
OperatorDemo02.java:13: 錯(cuò)誤: 不兼容的類(lèi)型: 從int轉(zhuǎn)換到char可能會(huì)有損失:
public class OperatorDemo02{public static void main(String[] args){int i = 10;char c = 'A';char ch = i + c;System.out.println(ch)} }字符串的"+"操作
public class OperatorDemo03{public static void main(String[] args){System.out.println("Marron" + "Hao"); // MarronHaoSystem.out.println("Marron" + 666); // Marron666System.out.println(666 + "Marron"); // 666MarronSystem.out.println("Marron" + 6 + 66); // Marron666System.out.println(1+ 99 + "年Marron"); // 100年Marron} }當(dāng)"+“操作中出現(xiàn)字符串時(shí),這個(gè)”+"是字符串連接符,而不是算數(shù)運(yùn)算符
賦值運(yùn)算符
| = | 賦值 | a=10, 將10賦值給變量a |
| += | 加后賦值 | a+=b, 將a+b的值給a |
| -= | 減后賦值 | a+=b, 將a-b的值給a |
| *= | 乘后賦值 | a*=b, 將a*b的值給a |
| /= | 除后賦值 | a/=b, 將a?b的商給a |
| %= | 取余后賦值 | a%=b, 將a?b的余數(shù)給a |
擴(kuò)展的賦值運(yùn)算符,隱含了強(qiáng)制類(lèi)型轉(zhuǎn)換
自增自減運(yùn)算符
| ++ | 自增 | 變量的值加1 |
| – | 自減 | 變量的值減1 |
關(guān)系運(yùn)算符
| == | a==b, 判斷a和b的值是否相等,成立為true,不成立為false |
| != | a!=b, 判斷a和b的值是否不相等,成立為true,不成立為false |
| > | a>b, 判斷a是否大于b,成立為true,不成立為false |
| >= | a>=b, 判斷a是否大于或等于b,成立為true,不成立為false |
| < | a<b, 判斷a是否小于b,成立為true,不成立為false |
| <= | a<=b, 判斷a是否小于或等于b,成立為true,不成立為false |
邏輯運(yùn)算符
| & | 邏輯與 | a&b, a和b都是true,結(jié)果為true,否則為false |
| | | 邏輯或 | a|b, a和b都是false,結(jié)果為false,否則為true |
| ^ | 邏輯異或 | a^b, a和b不同為true,否則為false |
| ! | 邏輯非 | !a, a為true時(shí),結(jié)果為false;a為false時(shí),結(jié)果為true |
[短路邏輯運(yùn)算符]
| && | 短路與 | 作用與&相同,但有短路效果 |
| || | 短路或 | 作用與|相同,但有短路效果 |
注意事項(xiàng):
- 邏輯運(yùn)算符,左右兩邊必然執(zhí)行
- 短路運(yùn)算符,只有當(dāng)前提條件滿足了后面的才執(zhí)行.
三元運(yùn)算符
- 格式: 關(guān)系表達(dá)式? 表達(dá)式1 : 表達(dá)式2
【案例1】: 動(dòng)物園里有兩只老虎,已知兩只老虎的體重分別為180kg、200kg,請(qǐng)用程序?qū)崿F(xiàn)判斷兩只老虎的體重是否相同.
public class OperatorTest01{public static void main(String[] args){int weight = 180;int weight = 200;boolean b = weight1 == weight2? true: false;System.out.println("b: " + b);} }【案例2】: 一座寺廟里住著三個(gè)和尚,已知他們的身高分別為150cm、210cm、165cm,請(qǐng)用程序?qū)崿F(xiàn)獲取者三個(gè)和尚的最高身高
public class OperatorTest02{public static void main(String[] args){int height1 = 150;int height2 = 210;int height3 = 165;int max1 = height1 > height2 ? height1 : height2;int max = max1 > height3 ? max1 : height3;System.out.println("max: " + max);} }14. 數(shù)據(jù)輸入
scanner使用的基本步驟
import java.util.Scanner;public class ScannerDemo{public static void main (String[] args){// 創(chuàng)建對(duì)象Scanner sc = new Scanner(System.in);// 接收數(shù)據(jù)int x = sc.nextInt();System.out.println("x: " + x);} }【栗子1】: 一個(gè)寺廟住著三個(gè)和尚,他們的身高必須經(jīng)過(guò)測(cè)量得出,請(qǐng)用程序?qū)崿F(xiàn)獲取這三個(gè)和尚的最高身高
import java.util.Scanner;public class ScannerTest{public static void main(String[] args){Scanner sc = new Scanner(System.in);int height1 = sc.nextInt();int height2 = sc.nextInt();int height3 = sc.nextInt();int tmpHeight = height1 > height2 ? height1 : height2;int maxHeight = tmpHeight > height3 ? tmpHeight : height3;System.out.println("maxHeight: " + maxHeight);} }15. 分支語(yǔ)句
順序結(jié)構(gòu)
順序結(jié)構(gòu): 是程序中最簡(jiǎn)單最基本的流程控制,沒(méi)有特定的語(yǔ)法結(jié)構(gòu),按照代碼的先后順序,依次執(zhí)行,程序中大多數(shù)的代碼都是這樣執(zhí)行的
/*順序結(jié)構(gòu) */ public class OrderDemo {public static void main(String[] args){System.out.println("開(kāi)始");System.out.println("語(yǔ)句A");System.out.println("語(yǔ)句B");System.out.println("語(yǔ)句C");System.out.println("結(jié)束");} }if 語(yǔ)句
- if語(yǔ)句格式1:
執(zhí)行流程:
- if語(yǔ)句格式2:
需求: 判斷輸入的a是否大于b.是在控制臺(tái)輸出"a大于b",否則輸出"a不大于b"
import java.util.Scanner; public class IfDemo02{public static void main (String[] args){System.out.println("開(kāi)始");Scanner sc = new Scanner(System.in);int a = sc.nextInt();int b = sc.nextInt();if(a > b){System.out.println("a大于b")} else {System.out.println("a不大于b")}System.out.println("結(jié)束");} }需求: 任意給出一個(gè)整數(shù),請(qǐng)用程序?qū)崿F(xiàn)判斷該整數(shù)是奇數(shù)還是偶數(shù),并在控制臺(tái)輸出該整數(shù)是奇數(shù)還是偶數(shù).
import java.util.Scanner; public class IfDemo03{public static void main(String[] args){System.out.println("開(kāi)始");Scanner sc = new Scanner(System.in);int num = sc.nextInt();if(num % 2 == 0){System.out.println("您輸入的是偶數(shù)");} else {System.out.println("您輸入的是奇數(shù)");}System.out.println("結(jié)束"); } }- if語(yǔ)句格式2:
需求: 輸入整數(shù)17,輸出星期一星期天
import java.util.Scanner; public class IfDemo04{public static void main(String[] args){System.out.println("開(kāi)始");Scanner sc = new Scanner(System.in);System.out.println("請(qǐng)輸入一個(gè)星期數(shù)(1-7)");int day = sc.nextInt();if(day == 1){System.out.println("星期一");} else if (day == 2) {System.out.println("星期二");} else if (day == 3) {System.out.println("星期三");} else if (day == 4) {System.out.println("星期四");} else if (day == 5) {System.out.println("星期五");} else if (day == 6) {System.out.println("星期六");} else if (day == 7) {System.out.println("星期天");}System.out.println("結(jié)束");} }switch語(yǔ)句
/*格式switch(表達(dá)式){case 值1:語(yǔ)句體1;break;case 值2:語(yǔ)句體2;break;...default:語(yǔ)句體n+1;[break;]} */需求: 一年有12個(gè)月,分別屬于春夏秋冬4個(gè)季節(jié),鍵盤(pán)錄入一個(gè)月份,請(qǐng)用程序?qū)崿F(xiàn)判斷該月份屬于哪個(gè)季節(jié),并輸出
import java.util.Scanner; public class SwitchTest{public static void main(String[] args){Scanner sc = new Scanner(System.in);System.out.println("請(qǐng)輸入一個(gè)月份: ");int month = sc.nextInt();switch(month){case 12:case 1:case 2:System.out.println("冬季");break;case 3:case 4:case 5:System.out.println("春季");break;case 6:case 7:case 8:System.out.println("夏季");break;case 9:case 10:case 11:System.out.println("秋季");break;default:System.out.println("您輸入的月份錯(cuò)誤");break;}} }16. 循環(huán)語(yǔ)句
for 循環(huán)語(yǔ)句
/*格式;for(初始化語(yǔ)句; 條件判斷語(yǔ)句; 條件控制語(yǔ)句){循環(huán)體語(yǔ)句;} */需求1: 輸出5次"HelloWorld"
public class ForDemo{public static void main(String[] args){for(int i = 0; i < 5; i++){System.out.println("HelloWorld");}} }需求2: 在控制臺(tái)輸出所有的"水仙花數(shù)"
public class ForTest{public static void main (String[] args){for(int i = 100; i <=999; i++){// 個(gè)位int units = i % 10;// 十位int tens = (i /10) % 10;// 百位int hundreds = i / 10/10 % 10;if(i == units * units * units + tens * tens * tens + hundreds * hundreds *hundreds ){System.out.println(i);}} } }while 循環(huán)語(yǔ)句
/*格式:while(條件判斷語(yǔ)句){循環(huán)體語(yǔ)句;條件控制語(yǔ)句;} */需求: 世界最高山峰珠穆朗瑪峰(8844.43米 = 8844430毫米), 假如我有一張足夠大的紙,它的初始厚度是0.1毫米.請(qǐng)問(wèn),折疊多少次,可以超過(guò)珠穆朗瑪峰的高度?
public class whileTest{public static void main(String[] args){double maxHeight = 8844430;double tmpHeight = 0.1;int count = 0;while(tmpHeight < maxHeight && count < 9999){tmpHeight *= 2;count++;}System.out.println("折疊: " + count + "次后,高度為: " + tmpHeight);} }do…while循環(huán)語(yǔ)句
/*基本格式:do{循環(huán)體語(yǔ)句;} while(條件判斷語(yǔ)句); */17. 跳轉(zhuǎn)控制語(yǔ)句
- continue: 用在循環(huán)中,基于條件控制,跳過(guò)某次循環(huán)體內(nèi)容的執(zhí)行,繼續(xù)下次一的執(zhí)行
- break: 用在循環(huán)體中,基于條件控制,終止循環(huán)體內(nèi)容的執(zhí)行,也就是說(shuō)結(jié)束當(dāng)前的整個(gè)循環(huán)
18. 循環(huán)嵌套
public class ForForDemo{public static void main(String[] args){for(int hour = 0; hour<24; hour++){for(int minute = 0; minute<60; minute++){System.out.println(hour + "時(shí)" + minute + "分");}System.out.println("---------------");}} }19. Random
用于產(chǎn)生一個(gè)隨機(jī)數(shù)
import java.util.Random; Random r = new Random(); int number = r.nextInt(10); /*產(chǎn)生10個(gè)隨機(jī)數(shù) */ import java.util.Random; public class RandomDemo{public static void main(String[] args){Random r = new Random();for(int i = 0; i< 10; i++){int number = r.nextInt(10);System.out.println("number: " + number);}// 生成一個(gè) 0~100之間的隨機(jī)數(shù)(包含0, 不包含100)int x = r.nextInt(100);} }【栗子】: 猜數(shù)字: 使用Random函數(shù)生成一個(gè)1~100之間的數(shù),然后等待玩家輸入數(shù)字.若比生成的大則提示猜大了,若小則提示猜小,否則提示"bingo"
import java.util.Random; import java.util.Scanner; public class RandomTest{public static void main(String[] args){Random r = new Random();Scanner sc = new Scanner(System.in);// 生成隨機(jī)數(shù)int num = r.nextInt(100) + 1;while(true){System.out.println("請(qǐng)輸入1~100");int guess = sc.nextInt();if(guess > num) {System.out.println("猜大了");} else if (guess < num){System.out.println("猜小了");} else {System.out.println("恭喜你猜中了");break;}}} }第四章 IDEA概述和安裝
IDEA全稱(chēng)IntelliJ IDEA是Java語(yǔ)言開(kāi)發(fā)的集成環(huán)境,它是業(yè)界公認(rèn)的目前用于Java程序開(kāi)發(fā)最好的工具.
-
集成環(huán)境: 把代碼編寫(xiě),編譯,執(zhí)行,調(diào)試等多種功能綜合到一起的開(kāi)發(fā)工具
-
IDEA的下載和安裝:
- 下載: https://www.jetbrains.com/idea/
- 安裝: 傻瓜式安裝,建議修改安裝路徑
IDEA中創(chuàng)建一個(gè)項(xiàng)目
IDEA中的項(xiàng)目結(jié)構(gòu)
- 在IDEA中是以項(xiàng)目為單位管理應(yīng)用程序的.
- 一個(gè)項(xiàng)目包含多個(gè)模塊
- 一個(gè)模塊包含多個(gè)包
- 一個(gè)包包含多個(gè)類(lèi)
IDEA中常用的快捷鍵
- 格式化: ‘Ctrl + alt + L’
- 注釋: ‘ctrl + /’
- 行移動(dòng): ‘a(chǎn)lt + shift + 上下箭頭’
- 復(fù)制行: ‘ctrl + D’
IDEA中模塊操作
-
新建模塊:
- File -> Project Structure -> New Module -> +號(hào) -> New Module ->選則JDK -> 修改模塊名
-
刪除模塊:
- 選擇需要?jiǎng)h除的模塊 -> Remove Module
- 以上刪除,模塊只是在IDEA中不顯示,在硬盤(pán)上還是存在的.需要到模塊對(duì)應(yīng)的目錄刪除
-
導(dǎo)入模塊:
- File -> Project Structor -> +號(hào) -> Import Module ->
第五章 數(shù)組
數(shù)組的定義格式
數(shù)組: 是一種用于存儲(chǔ)多個(gè)相同類(lèi)型數(shù)據(jù)的存儲(chǔ)模型
/*格式1:數(shù)據(jù)類(lèi)型[] 變量名int[] arr解讀: 定義了一個(gè)int類(lèi)型的數(shù)據(jù),數(shù)組名是arr */ /*格式2:數(shù)據(jù)類(lèi)型 變量名[]int arr[]解讀: 定義了一個(gè)int類(lèi)型的變量,變量名是arr數(shù)組 */數(shù)組初始化之動(dòng)態(tài)初始化
Java中的數(shù)組必須先初始化,然后才能使用
所謂初始化: 就是為數(shù)組中的數(shù)組元素分配內(nèi)存空間,并為每個(gè)數(shù)組元素賦值
動(dòng)態(tài)初始化
初始化時(shí)只指定數(shù)組長(zhǎng)度,由系統(tǒng)為數(shù)組分配初始值
- 格式: 數(shù)據(jù)類(lèi)型[] 變量名 = new 數(shù)組類(lèi)型[數(shù)組長(zhǎng)度]
- 范例: int[] arr = new int[3]
內(nèi)存分配
Java程序在運(yùn)行時(shí),需要在內(nèi)存中分配空間。為了提高運(yùn)算效率,就對(duì)空間進(jìn)行了不同區(qū)域的劃分,因?yàn)槊恳黄瑓^(qū)域都有特定的處理數(shù)據(jù)方式和內(nèi)存管理方式.看下面一段代碼:
int[] arr = new int[3]; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]);【棧內(nèi)存】: 存儲(chǔ)局部變量定義在方法中的變量,例如arr使用完畢,立即消失
【堆內(nèi)存】: 存儲(chǔ)new出來(lái)的內(nèi)容(實(shí)體、對(duì)象)
數(shù)組在初始化時(shí),會(huì)為存儲(chǔ)空間添加默認(rèn)值:
- 整數(shù): 默認(rèn)值0
- 浮點(diǎn)數(shù): 默認(rèn)值0.0
- 布爾值: 默認(rèn)值是false
- 字符: 默認(rèn)值是空字符
- 引用數(shù)據(jù)類(lèi)型: 默認(rèn)值是null
每一個(gè)new出來(lái)的東西都有一個(gè)地址值,使用完畢,會(huì)在垃圾回收器空閑時(shí)被回收
數(shù)組內(nèi)存圖(單個(gè)數(shù)組)
public class ArrarTest01{public static void main(String[] args){// 定義一個(gè)數(shù)組int[] arr = new int[3];// 輸出數(shù)組名及元素System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);// 給數(shù)組中的元素賦值arr[0] = 100;arr[2] = 200;// 再次輸出數(shù)組名及元素System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);} }數(shù)組內(nèi)存圖(多個(gè)數(shù)組)
public class ArrayTest02{public static void main(String[] args){// 定義兩個(gè)數(shù)組int[] arr = new int[2];int[] arr2 = new int[3];// 分別輸出數(shù)組名及元素System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr2);System.out.println(arr[0]);System.out.println(arr[2]);// 然后分別給數(shù)組中的元素賦值arr[0] = 100;arr2[0] = 200;arr2[2] = 300;// 分別再次輸出System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr2);System.out.println(arr[0]);System.out.println(arr[2]);} }數(shù)組內(nèi)存圖(多個(gè)數(shù)組指向相同)
public class ArrayTest03{public static void main(String[] args){// 定義一個(gè)數(shù)組int[] arr = new int[3];arr[0] = 100;arr[1] = 200;arr[2] = 300;System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);// 定義第二個(gè)數(shù)組指向第一個(gè)數(shù)組int[] arr2 = arr;arr2[0] = 111;arr2[1] = 222;arr2[2] = 333;// 輸出兩個(gè)數(shù)組的名及元素System.out.println(arr);System.out.println(arr[0]);System.out.println(arr2);System.out.println(arr2[0]);} }數(shù)組初始化之靜態(tài)初始化
靜態(tài)初始化: 初始化時(shí)指定每個(gè)數(shù)組元素的初始值,由系統(tǒng)決定數(shù)組長(zhǎng)度
int[] arr= new int[]{1,2,3};// 簡(jiǎn)寫(xiě) int[] arr= {1,2,3};數(shù)組操作的兩個(gè)常見(jiàn)小問(wèn)題
索引越界
訪問(wèn)了數(shù)組中不存在的索引對(duì)應(yīng)的元素,造成索引越界問(wèn)題
int[] arr = new int[3]; System.out.println(arr[3]); // 數(shù)組越界空指針異常
訪問(wèn)的數(shù)組已經(jīng)不再指向堆內(nèi)存的數(shù)據(jù),造成空指針異常
int[] arr = new int[3]; arr = null; System.out.println(arr[0]);數(shù)組常見(jiàn)操作
遍歷
public class ArrayTest01{public static void main(String[] args){int[] arr = {11, 22, 33, 44, 55};for(int i = 0;i < arr.length; i++){System.out.println(arr[i]);}} }獲取最值
public class ArrayTest02{public static void main(String[] args){int[] arr = {12, 45, 98, 73, 60};int max = arr[0];for(int i = 1; i< arr.length; i++){if(arr[i] > max){max = arr[i];} }System.out.println(max);} }第六章 方法
什么是方法
方法是將具有獨(dú)立功能的代碼塊組織成為一個(gè)整體,使其具有特殊功能的代碼集
注意:
- 方法必須先創(chuàng)建才可以使用,該過(guò)程成為方法定義
- 方法創(chuàng)建后并不是直接運(yùn)行的,需要手動(dòng)使用后才執(zhí)行,該過(guò)程成為方法調(diào)用.
方法的定義和調(diào)用
public class MethodDemo{public static void main(String[] args){isEvenNumber();}// 需求: 定義一個(gè)方法,在方法中定義一個(gè)變量,判斷該數(shù)據(jù)是否是偶數(shù)public static void isEvenNumber(){// 定義變量int number = 10;if(number %2 == 0){System.out.println("true")} else {System.out.println("false");}} }流程梳理:
- 首先會(huì)加載main方法中的代碼塊
- 當(dāng)遇到isEventNumber時(shí),會(huì)去尋找isEvenNumber方法,并進(jìn)入到該方法
- 執(zhí)行完isEventNumber之后,會(huì)返回執(zhí)行環(huán)境給main函數(shù)
【栗子】: 設(shè)計(jì)一個(gè)方法,用于打印兩個(gè)數(shù)中的較大數(shù)
public class MethodTest{public static void main(String[] args){printMax(10, 20);}public static void printMax(int x, int y){if(x > y){System.out.println(x);} else {System.out.println(y);}} }帶參數(shù)方法的定義和調(diào)用
方法定義時(shí),注意:
- 參數(shù)中的數(shù)據(jù)類(lèi)型與變量名都不能缺少,缺少任意一個(gè)程序?qū)?bào)錯(cuò)
- 多個(gè)參數(shù)之間使用逗號(hào)分隔.
【栗子】: 定義一個(gè)方法,接收一個(gè)參數(shù),判斷這個(gè)數(shù)是否為偶數(shù)
public class MehtodTest01{public static void main(String[] args){isEvent(15);}public static void isEvent(int x){if(x % 2 == 0){System.out.println(true);} else {System.out.println(false);}} }方法的注意事項(xiàng)
- 方法不能嵌套定義
- void表示無(wú)返回值,可以省略return,也可以單獨(dú)的書(shū)寫(xiě)return,后面不加數(shù)據(jù)
方法的通用格式
/*public static 返回值類(lèi)型 方法名(參數(shù)){方法體;return 數(shù)據(jù);} */方法重載
public class MethodDemo{public static int sum(int a, int b){return a + b;}public static int sum(int a, int b, int c) {return a + b + c;} }方法重載: 同一個(gè)類(lèi)中定義的多個(gè)方法之間的關(guān)系,滿足下列條件的多個(gè)方法相互構(gòu)成重載
- 多個(gè)方法在同一個(gè)類(lèi)中
- 多個(gè)方法具有相同的方法名
- 多個(gè)方法的參數(shù)不同(數(shù)量或類(lèi)型不同)
【方法重載的特點(diǎn)】
- 重載僅對(duì)應(yīng)方法的定義,與方法的調(diào)用無(wú)關(guān),調(diào)用方式參照標(biāo)準(zhǔn)格式
- 重載僅針對(duì)同一個(gè)類(lèi)中方法的名稱(chēng)與參數(shù)進(jìn)行識(shí)別,與返回值無(wú)關(guān),換句話說(shuō)不能通過(guò)返回值來(lái)判定兩個(gè)方法是否相互構(gòu)成重載.
【栗子】: 使用方法重載的思想,設(shè)計(jì)比較兩個(gè)整數(shù)是否相同的方法,兼容全整數(shù)類(lèi)型(byte, short, int, long)
public class MethodTest01{public static void main(String[] args){System.out.println(compare(10, 20));System.out.println(compare((byte) 10, (byte) 20));System.out.println(compare((short) 10,(short) 20));System.out.println(compare(10L, 20L));}public static boolean compare(int a, int b){return a == b;}public static boolean compare(byte a, byte b){return a == b;}public static boolean compare(short a, short b){return a == b;}public static boolean compare(long a, long b){return a == b;} }方法的參數(shù)傳遞
基本類(lèi)型
public class ArgsDemo01{public static void main(String[] args){int number = 100;System.out.println('調(diào)用change方法前:' + number);change(number);System.out.println('調(diào)用change方法后:' + number);}public static void change(int number){number = 200;} }對(duì)于基本數(shù)據(jù)類(lèi)型的參數(shù),形式參數(shù)的改變,不影響實(shí)際參數(shù)的值
引用類(lèi)型
public class ArgsDemo02{public static void main(String[] args){int[] arr = {10, 20, 30};System.out.println('調(diào)用change方法前:' + arr[1]);change(arr);System.out.println('調(diào)用change方法后:' + arr[1]);}public static void change(int[] arr) {arr[1] = 200;} }對(duì)于引用類(lèi)型的參數(shù),形式參數(shù)的改變,影響實(shí)際參數(shù)的值
【栗子1】: 設(shè)計(jì)一個(gè)方法用于數(shù)組遍歷,要求遍歷的結(jié)果是在一行上的。例如:[11, 22, 33, 44, 55]
System.out.prinln(): 輸出內(nèi)容換行
System.out.print(): 輸出內(nèi)容不換行
public class MethodTest01 {public static void main(String[] args) {int[] arr = {11, 22, 33, 44, 55};printArray(arr);}public static void printArray(int[] arr) {System.out.print("[");for (int i = 0; i < arr.length; i++) {if (i != arr.length - 1) {System.out.print(arr[i] + ", ");} else {System.out.print(arr[i]);}}System.out.print("]");} }【栗子2】: 設(shè)計(jì)一個(gè)方法用于獲取數(shù)組中元素的最大值,調(diào)用方法并輸出結(jié)果
public class MethodTest02 {public static void main(String[] args) {int[] arr = {1, 3, 5, 4, 2, 8, 9};System.out.println(getMax(arr));}public static int getMax(int[] arr) {int max = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}return max;} }【栗子3】: 輸入星期數(shù),顯示今天的減肥活動(dòng)(周一: 跑步, 周二: 游泳, 周三: 慢走, 周四: 動(dòng)感單車(chē), 周五: 拳擊, 周六: 爬山, 周日: 好好吃一頓)
public class Test01 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("請(qǐng)輸入星期數(shù): ");int day = sc.nextInt();while (day < 1 || day > 7) {System.out.println("請(qǐng)輸入整數(shù) 1~7");day = sc.nextInt();}if (day == 1) {System.out.println("跑步");}if (day == 2) {System.out.println("游泳");}if (day == 3) {System.out.println("慢走");}if (day == 4) {System.out.println("動(dòng)感單車(chē)");}if (day == 5) {System.out.println("拳擊");}if (day == 6) {System.out.println("爬山");}if (day == 7) {System.out.println("好好吃一頓");}} }【栗子4】: 朋友聚會(huì)的時(shí)候可能會(huì)玩一個(gè)游戲: 逢七過(guò)。規(guī)則是: 從任意一個(gè)數(shù)字開(kāi)始報(bào)數(shù),當(dāng)你要報(bào)的數(shù)字包含7或者是7的倍數(shù)時(shí)都要說(shuō): 過(guò).為了幫助大家更好的玩這個(gè)游戲,這里我們直接在控制臺(tái)打印1~100之間的滿足逢七過(guò)規(guī)則的數(shù)據(jù).
public class Test02 {public static void main(String[] args) {for (int i = 1; i < 100; i++) {if (i % 7 == 0 || i / 10 % 10 == 7 || i % 10 == 7) {System.out.println(i);}}} }【栗子5】: 有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子長(zhǎng)到第3個(gè)月后每個(gè)月又生一對(duì)兔子,假如兔子都不死,問(wèn)第二十個(gè)月的兔子對(duì)數(shù)為多少?
思路:
第1個(gè)月兔子對(duì)數(shù)為 1 對(duì)
第2個(gè)月兔子對(duì)數(shù)為 1 對(duì)
第3個(gè)月兔子對(duì)數(shù)為 2 對(duì)
第4個(gè)月兔子對(duì)數(shù)為 3 對(duì)
第5個(gè)月兔子對(duì)數(shù)為 5 對(duì)
即 a[n] = a[n-1] + a[n-2];用動(dòng)態(tài)規(guī)劃
public class Test03 {public static void main(String[] args) {int[] arr = new int[20];arr[0] = 1;arr[1] = 1;for (int i = 2; i < 20; i++) {arr[i] = arr[i - 1] + arr[i - 2];}System.out.println(arr[19]);} }【栗子6】: 我國(guó)古代數(shù)學(xué)家張丘建在《算經(jīng)》一書(shū)中提出的數(shù)學(xué)問(wèn)題: 雞翁一值錢(qián)五,雞母一值錢(qián)三,雞雌三值錢(qián)一。問(wèn)雞翁、雞母、雞雌各幾何?
思路:
假設(shè) 雞翁、雞母、雞雌 的數(shù)量各為 x , y, z 有以下等式成立
x + y + z = 100
5x + 3y + z/3 = 100
0<= x <= 20
0<=y <= 33
0<= z <= 100
循環(huán)遍歷 x和y, 讓 z = 100 - x - y; 然后z要能整除3 以及 滿足等式 5x + 3y + z/3 = 100
public class Test04 {public static void main(String[] args) {for (int x = 0; x <= 20; x++) {for (int y = 0; y <= 33; y++) {int z = 100 - x - y;if (z % 3 == 0 && 5 * x + 3 * y + z / 3 == 100) {System.out.println(x + " " + y + " " + z);}}}} }第七章 類(lèi)和對(duì)象
萬(wàn)物皆對(duì)象,客觀存在的事物皆稱(chēng)為對(duì)象
什么是類(lèi)
類(lèi): 是對(duì)現(xiàn)實(shí)生活中一類(lèi)具有共同屬性和行為的事物的抽象
類(lèi)的特點(diǎn):
- 類(lèi)是對(duì)象的數(shù)據(jù)類(lèi)型
- 類(lèi)是具有相同屬性和行為的一組對(duì)象的集合
對(duì)象: 是能夠看得見(jiàn)摸得著的真實(shí)存在的實(shí)體
對(duì)象的屬性: 對(duì)象具有各種特征,每個(gè)對(duì)象的每個(gè)屬性都有特定的值
對(duì)象的行為: 對(duì)象能夠執(zhí)行的操作
類(lèi)的定義
類(lèi)的重要性: 是Java程序的基本組成單位
- 類(lèi)的組成: 屬性和行為
- 屬性: 在類(lèi)中通過(guò)成員變量來(lái)體現(xiàn)(類(lèi)中方法外的變量)
- 行為: 在類(lèi)中通過(guò)成員方法來(lái)體現(xiàn)(和前面的方法相比去掉static關(guān)鍵字即可)
對(duì)象的使用
- 創(chuàng)建對(duì)象:
- 格式: 類(lèi)名 對(duì)象名 = new 類(lèi)名();
- 范例: Phone p = new Phone();
- 使用對(duì)象:
- 使用成員變量:
- 格式: 對(duì)象名.變量名
- 范例:p.brand
- 使用成員方法:
- 格式: 對(duì)象名.方法名()
- 范例: p.call()
- 使用成員變量:
【栗子】: 首先定義一個(gè)學(xué)生類(lèi),然后定義一個(gè)學(xué)生測(cè)試類(lèi),在學(xué)生測(cè)試類(lèi)中通過(guò)對(duì)象完成成員變量和成員方法的使用
// Student.java public class Student{// 成員變量String name;int age;// 成員方法public void study(){Syste.out.println("好好學(xué)習(xí),天天向上");}public void doHomework(){System.out.println("代碼敲爛,月薪過(guò)萬(wàn)");} } // StudentDemo.java public class StudentDemo{public static void main(String[] args){Student s = new Student();System.out.println(s.name + "," + s.age);s.name="林青霞";s.age = 30;System.out.println(s.name + "," + s.age);s.study();s.doHomework();} }多個(gè)對(duì)象指向相同
public class StudentTest03{public static void main(String[] args){Student s1 = new Student();s1.name = "林青霞";s1.age = 30;System.out.println(s1.name + "," + s1.age);Student s2 = s1;s2.name = "張曼玉";s2.age = 28;System.out.println(s1.name + "," + s1.age);System.out.println(s2.name + "," + s2.age);} }成員變量和局部變量
public class Student {String name;public void study(){int i = 0;System.out.println("好好學(xué)習(xí)");}public void doHomework(){System.out.println("多做練習(xí)");int j = 0;}int age; }成員變量: 類(lèi)中方法外的變量
局部變量: 方法中的變量
| 類(lèi)中位置不同 | 類(lèi)中方法外 | 方法內(nèi)或者方法聲明上 |
| 內(nèi)存中位置不同 | 堆內(nèi)存 | 棧內(nèi)存 |
| 生命周期不同 | 隨著對(duì)象的存在而存在,隨著對(duì)象的消失而消失 | 隨著方法的調(diào)用而存在,隨著方法的調(diào)用完畢而消失 |
| 初始值不同 | 有默認(rèn)的初始化值 | 沒(méi)有默認(rèn)的初始化值,必須先定義,賦值,才能使用 |
封裝
private
- 是一個(gè)權(quán)限修飾符
- 可以修飾成員(成員變量和成員方法)
- 作用是保護(hù)成員不被別的類(lèi)使用,被private修飾的成員只能在本類(lèi)中才能訪問(wèn)
針對(duì)private修飾的成員變量,如果需要被其他類(lèi)使用,提供相應(yīng)的操作
- 提供"get變量名()"方法,用于獲取成員變量的值,方法用public修飾
- 提供"set變量名(參數(shù))"方法,用于設(shè)置成員變量的值,方法用public修飾
【栗子】:
// Student.java public class Student{String name;int age;public void show(){System.out.println(name + "," + age);} }// 使用private關(guān)鍵字 public class Student {String name;private int age;// 提供get/set方法public void setAge(int a){if(a < 0 || a > 180){System.out.println("您給的年齡有誤");} else {age = a;}}public int getAge(){return age;}public void show(){System.out.println(name + "," + age);} }this
public class Student {private String name;public void setName(String name){this.name = name;}public void show(){System.out.println(this.name);} }public class StudentDemo{public static void main(String[] args){Student s = new Student();s.setNmae("Marron");s.show();} }-
this修飾的變量用于指代成員變量
-
方法的形參與成員變量同名,不帶this修飾的變量指的是形參,而不是成員變量
- public class Student{private String name;public String getName(){return name;}public void setName(String name){// 此處name指向形參,this.name執(zhí)行成員變量this.name = name;} }
-
方法的形參沒(méi)有與成員變量同名,不帶this修飾的變量指的是成員變量
-
小結(jié)
面向?qū)ο笕筇卣髦?封裝、繼承、多態(tài))
是面向?qū)ο缶幊陶Z(yǔ)言堆客觀世界的模擬,客觀世界成員變量都是隱藏在對(duì)象內(nèi)部的,外界無(wú)法直接操作的
將類(lèi)的某些信息隱藏在類(lèi)內(nèi)部,不允許外部程序直接訪問(wèn),而是通過(guò)該類(lèi)提供的方法來(lái)實(shí)現(xiàn)堆隱藏信息的操作和訪問(wèn)成員變量private,提供對(duì)應(yīng)的getXxx()/setXxx()方法
public class Student{private String name;public String getName(){return name;}public void setNamee(String name) {this.name = name;} }通過(guò)方法來(lái)控制成員變量的操作,提高了代碼的安全性
把代碼用方法進(jìn)行封裝,提高了代碼的復(fù)用性
構(gòu)造方法
構(gòu)造方法是一種特殊的方法,其作用是用來(lái)創(chuàng)建對(duì)象
/*格式:public class 類(lèi)名{修飾符 類(lèi)名(參數(shù)) {...}} */功能: 主要是完成對(duì)象數(shù)據(jù)的初始化
public class Student {private String name;private int age;// 構(gòu)造方法public Student(){System.out.println("無(wú)參構(gòu)造方法");}public void show() {System.out.println(name + "," + age);} }- 下面使用重載和封裝的思想定義一個(gè)Student類(lèi)
標(biāo)準(zhǔn)類(lèi)制作
- 成員變量: 使用private修飾
- 構(gòu)造方法: 提供一個(gè)無(wú)參構(gòu)造方法,提供一個(gè)帶多個(gè)參數(shù)的構(gòu)造方法
- 成員方法:
- 提供每一個(gè)成員變量對(duì)應(yīng)的setXxx()/getXxx()
- 提供一個(gè)顯示對(duì)象信息的show()
- 創(chuàng)建對(duì)象并為其成員變量賦值的兩種方式
- 無(wú)參構(gòu)造方法創(chuàng)建后使用setXxx()賦值
- 使用帶參數(shù)構(gòu)造方法直接創(chuàng)建帶有屬性值得對(duì)象
第八章 字符串
API
API(application programing interface): 應(yīng)用程序編程接口
編寫(xiě)一個(gè)機(jī)器人程序去控制機(jī)器人踢足球,程序需要向機(jī)器人發(fā)出向前跑、向后跑、射門(mén)、搶球等各種命令。機(jī)器人廠商提供一些用于控制機(jī)器人的接口類(lèi),這些類(lèi)中定義好了操作機(jī)器人的各種動(dòng)作的方法。其實(shí),這些接口類(lèi)就是機(jī)器人廠商提供給應(yīng)用程序編程的接口,大家把這些類(lèi)稱(chēng)為API
Java API: 指的就是JDK中提供的各種功能的Java類(lèi)
String
String類(lèi)代表字符串,Java程序中的所有字符串文字(例如"abc")都被視為此類(lèi)的實(shí)例。也就是說(shuō),Java程序中所有的雙引號(hào)字符串,都是String類(lèi)的對(duì)象
字符串的特點(diǎn):
-
字符串不可變,它們的值在創(chuàng)建后不能被更改
-
雖然String的值是不可改變的,但是它們可以被共享
-
字符串效果上相當(dāng)于字符數(shù)組(char[]),但是底層原理是字節(jié)數(shù)組(byte[])
String構(gòu)造方法(常用)
| public String() | 創(chuàng)建一個(gè)空白字符串對(duì)象,不含有任何內(nèi)容 |
| public String(char[] chs) | 根據(jù)字符數(shù)組的內(nèi)容,來(lái)創(chuàng)建字符串對(duì)象 |
| public String(byte[] bys) | 根據(jù)字節(jié)數(shù)組的內(nèi)容,來(lái)創(chuàng)建字符串對(duì)象 |
| String s = “abc”; | 直接賦值的方式創(chuàng)建字符串對(duì)象,內(nèi)容就是abc |
String對(duì)象的特點(diǎn)
- 通過(guò)new創(chuàng)建字符串對(duì)象,每一次new都會(huì)申請(qǐng)一個(gè)內(nèi)存空間,雖然內(nèi)容相同,但是地址值不同
- 以 ”“方式給出的字符串,只要字符序列相同(順序和大小),無(wú)論在程序代碼中出現(xiàn)幾次,JVM只會(huì)建立一個(gè)String對(duì)象,并在字符串池中維護(hù)
字符串的比較
使用==做比較
- 基本類(lèi)型: 比較的是數(shù)據(jù)值是否相同
- 引用類(lèi)型: 比較的是地址值是否相同
字符串是對(duì)象,它比較內(nèi)容是否相同,是通過(guò)一個(gè)方法來(lái)實(shí)現(xiàn)的,這個(gè)方法叫: equals()
- public boolean equals(Object anObject): 將此字符串與指定對(duì)象進(jìn)行比較。由于我們比較的是字符串對(duì)象,所以參數(shù)直接傳遞一個(gè)字符串
幾個(gè)小栗子
【栗子1】: 簡(jiǎn)單登錄比較
已知用戶名和密碼,請(qǐng)用程序?qū)崿F(xiàn)模擬用戶登錄。總共給三次機(jī)會(huì),登錄之后會(huì),給出相應(yīng)的提示
public class StringTest01 {public static void main(String[] args) {// 已知用戶名和密碼,定義兩個(gè)字符串即可String username = "marron";String password = "lzhhc";for (int i = 3; i > 0; i--) {Scanner sc = new Scanner(System.in);System.out.println("請(qǐng)輸入用戶名: ");String name = sc.nextLine();System.out.println("請(qǐng)輸入密碼: ");String pwd = sc.nextLine();if (name.equals(username) && pwd.equals(password)) {System.out.println("登錄成功");break;} else {if (i - 1 == 0) {System.out.println("登錄失敗");} else {System.out.printf("登錄失敗,你還有" + (i - 1) + "次機(jī)會(huì)");}}}} }【栗子2】: 遍歷字符串
public class StringTest02 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("請(qǐng)輸入字符串: ");String line = sc.nextLine();for (int i = 0; i < line.length(); i++) {System.out.println(line.charAt(i));}} }【栗子3】: 統(tǒng)計(jì)字符次數(shù)
需求: 鍵盤(pán)錄入一個(gè)字符串,統(tǒng)計(jì)該字符串中大寫(xiě)字母字符,小寫(xiě)字母字符,數(shù)字字符出現(xiàn)的次數(shù)(不考慮其他字符)
public class StringTest03 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("請(qǐng)輸入字符串");String print = sc.nextLine();int upper = 0;int lower = 0;int number = 0;for (int i = 0; i < print.length(); i++) {char ch = print.charAt(i);if ('0' <= ch && ch <= '9') {number++;}if ('a' <= ch && ch <= 'z') {lower++;}if ('A' <= ch && ch <= 'Z') {upper++;}}System.out.println("大寫(xiě)字母?jìng)€(gè)數(shù)為: " + upper);System.out.println("小寫(xiě)字母?jìng)€(gè)數(shù)為: " + lower);System.out.println("數(shù)字個(gè)數(shù)為: " + number);} }【栗子4】: 拼接字符串
需求: 定義一個(gè)方法,把int數(shù)組中的數(shù)據(jù)按照指定的格式拼接成一個(gè)字符串返回,調(diào)用該方法,并在控制臺(tái)輸出結(jié)果。
例如: 數(shù)組為 int[] arr = {1, 2, 3}, 執(zhí)行方法后的輸出結(jié)果為: [1, 2, 3];
public class StringTest04 {public static void main(String[] args) {int[] arr = {1, 2, 3};System.out.println(arr2String(arr));}public static String arr2String(int[] arr) {String str = "";str += "[";for (int i = 0; i < arr.length; i++) {if (i != arr.length - 1) {str += arr[i] + ", ";} else {str += arr[i];}}str += "]";return str;} }【栗子5】: 字符串反轉(zhuǎn)
需求: 定義一個(gè)方法,實(shí)現(xiàn)字符串反轉(zhuǎn)。鍵盤(pán)錄入一個(gè)字符串,調(diào)用該方法后,再控制臺(tái)輸出結(jié)果.
例如,鍵盤(pán)錄入abc,輸出結(jié)果cba
public class StringTest05 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("請(qǐng)輸入一個(gè)字符串");String str = sc.nextLine();System.out.printf(reverseStr(str));}public static String reverseStr(String s) {String tmpS = "";for (int i = s.length() - 1; i >= 0; i--) {tmpS += s.charAt(i);}return tmpS;} }String常用方法
| public boolean equals(Object anObject) | 比較字符串的內(nèi)容,嚴(yán)格區(qū)分大小寫(xiě)(用戶名和密碼) |
| public char charAt(int index) | 返回指定索引處的char值 |
| public int length() | 返回此字符串的長(zhǎng)度 |
StringBuilder
Public static void main(String[] args){String s = "hello";s += "world";System.out.println(s); }首先在棧內(nèi)存中加載方法: main
然后執(zhí)行 String s = "hello".
- 會(huì)在堆內(nèi)存的常量池創(chuàng)建一個(gè)"hello",編號(hào)為001
- 將001賦值給s
然后執(zhí)行 s += "world"
- 會(huì)在堆內(nèi)存的常量池創(chuàng)建一個(gè)"world",編號(hào)為002
- 在堆內(nèi)存的常量池創(chuàng)建一個(gè)"helloworld",編號(hào)003
- 將003賦值給s
最后執(zhí)行"System.out.println(s)"
- 輸出s時(shí),會(huì)根據(jù)003找到"helloworld",然后輸出
如果堆字符串進(jìn)行拼接操作,每次拼接,都會(huì)構(gòu)建一個(gè)新的String對(duì)象,既耗時(shí),又浪費(fèi)內(nèi)存空間,而這種操作還不可避免。可以使用Java提供的 StringBuilder類(lèi)來(lái)解決這個(gè)問(wèn)題。
StringBuilder是一個(gè)可變的字符串類(lèi),我們可以把它看成是一個(gè)容器,這里的可變指的是StringBuilder對(duì)象中的內(nèi)容是可變的
| public String Builder() | 創(chuàng)建一個(gè)空白可變字符串對(duì)象,不含又任何內(nèi)容 |
| public StringBuilder(String str) | 根據(jù)字符串的內(nèi)容,來(lái)創(chuàng)建可變字符串對(duì)象 |
| public StringBuilder append(任意類(lèi)型) | 添加數(shù)據(jù),并返回對(duì)象本身 |
| public StringBuilder reverse() | 返回相反的字符序列 |
StringBuilder和String相互轉(zhuǎn)換
StringBuilder轉(zhuǎn)換為String:
- public String toString(): 通過(guò)toString()就可以實(shí)現(xiàn)把StringBuilder轉(zhuǎn)換為String
String轉(zhuǎn)換為StringBuilder
- public StringBuilder(String s): 通過(guò)構(gòu)造方法就可以實(shí)現(xiàn)把String轉(zhuǎn)換為StringBuilder
StringBuildr小栗子
【栗子1】: 拼接字符串
需求: 定義一個(gè)方法,把int數(shù)組中的數(shù)據(jù)按照指定的格式拼接成一個(gè)字符串返回,調(diào)用該方法,并在控制臺(tái)輸出結(jié)果.
例如: 數(shù)組為int[] arr = {1, 2, 3}; 執(zhí)行方法后的輸出結(jié)果為: [1, 2, 3]
public class StringBuilderTest01 {public static void main(String[] args) {int[] arr = {1, 2, 3};System.out.printf(arr2String(arr));}public static String arr2String(int[] arr) {StringBuilder sb = new StringBuilder();sb.append("[");for (int i = 0; i < arr.length; i++) {if (i != arr.length - 1) {sb.append(arr[i]);sb.append(", ");} else {sb.append(arr[i]);}}sb.append("]");String str = sb.toString();return str;} }【栗子2】: 字符串反轉(zhuǎn)
需求: 定義一個(gè)方法,實(shí)現(xiàn)字符串反轉(zhuǎn)。鍵盤(pán)錄入一個(gè)字符串,調(diào)用該方法后,在控制臺(tái)輸出結(jié)果
例如: 鍵盤(pán)錄入abc,輸出結(jié)果cba
public class StringBuilderTest02 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("請(qǐng)輸入字符串: ");String str = sc.nextLine();System.out.println(reverseStr(str));}public static String reverseStr(String s){StringBuilder sb = new StringBuilder(s);return sb.reverse().toString();} }第九章 集合之ArrayList
編程的時(shí)候如果要存儲(chǔ)多個(gè)數(shù)據(jù),使用長(zhǎng)度固定的數(shù)組存儲(chǔ)格式,不一定能滿足我們的需求,更適應(yīng)不了變化的需求,那么,此時(shí)該如何選擇呢?
集合概述: 集合類(lèi)的特點(diǎn)是,提供了一種存儲(chǔ)空間可變的存儲(chǔ)模型,存儲(chǔ)的數(shù)據(jù)容量可以發(fā)生改變.下面主要學(xué)習(xí)ArrayList
ArrayList:
- 可調(diào)整大小的數(shù)組實(shí)現(xiàn)
- : 是一種特殊的數(shù)據(jù)類(lèi)型,泛型。
ArrayList構(gòu)造方法和添加方法
| public ArrayList() | 創(chuàng)建一個(gè)空的集合對(duì)象 |
| public boolean add(E e) | 將指定的元素追加到此集合的末尾 |
| public void add(int index, E element) | 此集合中的指定位置插入指定的元素 |
ArrayList集合常用方法
| public boolean remove(Object o) | 刪除指定的元素,返回刪除是否成功 |
| public E remove(int index) | 刪除指定索引處的元素,返回被刪除的元素 |
| public E set(int index, E element) | 修改指定索引處的元素,返回被修改的元素 |
| public E get(int index) | 返回指定索引處的元素 |
| public int size() | 返回集合中的元素的個(gè)數(shù) |
【小栗子】: 遍歷集合
需求: 創(chuàng)建一個(gè)存儲(chǔ)字符串的集合,存儲(chǔ)3個(gè)字符串元素,使用程序?qū)崿F(xiàn)在控制臺(tái)遍歷該集合
import java.util.ArrayList;public class ArrayListTest02 {public static void main(String[] args) {// 創(chuàng)建集合對(duì)象ArrayList<String> array = new ArrayList<>();// 在集合中添加字符串對(duì)象array.add("Marron");array.add("Mar");array.add("lzhhc");// 遍歷集合for (int i = 0; i < array.size(); i++) {System.out.println(array.get(i));}} }【小栗子】: 存儲(chǔ)學(xué)生對(duì)象并遍歷
需求: 創(chuàng)建一個(gè)存儲(chǔ)學(xué)生對(duì)象的集合,存儲(chǔ)3個(gè)學(xué)生對(duì)象,使用程序?qū)崿F(xiàn)在控制臺(tái)遍歷該集合
- 學(xué)生類(lèi)如下:
【小栗子】: 存儲(chǔ)學(xué)生對(duì)象并遍歷(帶輸入)
需求: 創(chuàng)建一個(gè)存儲(chǔ)學(xué)生對(duì)象的集合,存儲(chǔ)3個(gè)學(xué)生對(duì)象,使用程序在控制臺(tái)實(shí)現(xiàn)遍歷該集合學(xué)生的姓名和年齡來(lái)自鍵盤(pán)錄入
import java.util.ArrayList; import java.util.Scanner;public class ArrayListTest03 {public static void main(String[] args) {ArrayList<Student> array = new ArrayList();addStudent(array);addStudent(array);addStudent(array);for (int i = 0; i < array.size(); i++) {Student s = array.get(i);System.out.println(s.getName() + "," + s.getAge());}}public static void addStudent(ArrayList<Student> array) {Scanner sc = new Scanner(System.in);System.out.println("請(qǐng)輸入學(xué)生姓名");String name = sc.nextLine();System.out.println("請(qǐng)輸入學(xué)生年齡");int age = sc.nextInt();Student s = new Student();s.setName(name);s.setAge(age);array.add(s);} }總結(jié)
以上是生活随笔為你收集整理的Java --- 基础学习Ⅰ的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql pid_mysql pid文
- 下一篇: java美元兑换,(Java实现) 美元