主要內(nèi)容
- 變量
- Java數(shù)據(jù)類型
- Java數(shù)據(jù)類型轉(zhuǎn)換
- 運(yùn)算符
學(xué)習(xí)目標(biāo)
- 掌握變量的定義、初始化、使用及注意事項(xiàng)
- 掌握J(rèn)ava基本數(shù)據(jù)類型的使用(4類8種)
- 掌握數(shù)據(jù)類型的轉(zhuǎn)換及其中的注意事項(xiàng)
第一節(jié) 變量
1.1 概念
? 變量: 程序運(yùn)行時(shí)候可以變化的量.
? 思考過(guò)沒(méi)有, 變量用來(lái)干什么?
? 答案: 變量本質(zhì)就是對(duì)"實(shí)際量"的一個(gè)指代, 就是一個(gè)代詞. 和我們?cè)跀?shù)學(xué)中見(jiàn)到的函數(shù)變量一樣, 函數(shù)的本質(zhì)是因變量隨著自變量的變化而變化, 所以使用x,y之類的變量來(lái)表示這個(gè)變化的數(shù); 編程中的變量也是同樣道理.
1.2 變量的定義
? 概述: 在使用變量之前, 我們首先要在程序中告訴機(jī)器, 給我們創(chuàng)建一個(gè)什么類型的變量, 這個(gè)聲明的過(guò)程也叫做變量的定義.
? 方式1(定義并初始化變量):
? 數(shù)據(jù)類型 變量名 = 值;
public static void main(String[] args){
System.out.println("定義變量的方式1: ");
//定義一個(gè)字符串類型的變量
String studentName = "小馬哥";
//定義一個(gè)整形變量
int stuAge = 30;
}
? 方式2(先定義變量, 用的時(shí)候再初始化):
? 數(shù)據(jù)類型 變量名;
? 變量名 = 值;
public static void main(String[] args){
System.out.println("定義變量的方式2: ");
//定義一個(gè)字符串類型的變量
String studentName;
//定義一個(gè)整形變量
int stuAge;
/*
其它代碼
*/
//變量初始化
stuAge = 30;
studentName = "小馬哥";
}
1.3 變量的使用
變量定義和初始化的目的是為了使用的, 如何使用呢? 直接調(diào)用變量的名字.
//使用"定義并初始化"之后的變量: 打印
System.out.println("學(xué)員姓名: "+studentName);
System.out.println("學(xué)員年齡: "+stuAge);
1.4 注意事項(xiàng)
學(xué)習(xí)提示: 以下各個(gè)注意事項(xiàng), 先自己測(cè)試思考總結(jié)到你自己的筆記上, 然后對(duì)比講義的實(shí)驗(yàn)結(jié)果.
- 1,變量使用之前,必須初始化;
- 2,使用變量的時(shí)候,必須有這個(gè)變量;
- 3,變量在相同的作用域下不能重名;
- 4,在不同的作用域中,變量不能互相使用
- 5,變量可以同時(shí)定義,但是初始化賦值只能單獨(dú)的
代碼演示:
試驗(yàn)1: 使用變量前, 不進(jìn)行初始化的后果
public class Demo03_warning1{
public static void main(String[] args){
// 1,變量使用之前,必須初始化;
String name;
System.out.println(name);
}
}
? 運(yùn)行結(jié)果:
D:\OnlineEdu\Task02 數(shù)據(jù)類型 運(yùn)算符\code>javac Demo03_warning1.java
Demo03_warning1.java:5: 錯(cuò)誤: 可能尚未初始化變量name
System.out.println(name);
^
1 個(gè)錯(cuò)誤
? 結(jié)果解釋:
? Demo03_warning1.java:5: 錯(cuò)誤: 可能尚未初始化變量name
? 代表在 Demo03_warning1.java 文件的第 5 行代碼出現(xiàn)錯(cuò)誤
試驗(yàn)2: 使用變量之前, 沒(méi)有定義變量的結(jié)果
public class Demo03_warning2{
public static void main(String[] args){
//2,使用變量的時(shí)候,必須有這個(gè)變量;
System.out.println(studentName);
System.out.println(contry);
}
}
? 運(yùn)行結(jié)果:
Demo03_warning2.java:3: 錯(cuò)誤: 找不到符號(hào)
System.out.println(studentName);
^
符號(hào): 變量 studentName
位置: 類 Demo03_warning2
Demo03_warning2.java:4: 錯(cuò)誤: 找不到符號(hào)
System.out.println(contry);
^
符號(hào): 變量 contry
位置: 類 Demo03_warning2
2 個(gè)錯(cuò)誤
試驗(yàn)3: 變量在相同的作用域下不能重名;(定義多個(gè)重名變量試試)
public class Demo03_warning3{
public static void main(String[] args){
//3, 測(cè)試定義重復(fù)的變量
int age = 10;
int age = 100;
System.out.println(age);
}
}
? 運(yùn)行結(jié)果:
D:\OnlineEdu\Task02 數(shù)據(jù)類型 運(yùn)算符\code>javac Demo03_warning3.java
Demo03_warning3.java:4: 錯(cuò)誤: 已在方法 main(String[])中定義了變量 age
int age = 100;
^
1 個(gè)錯(cuò)誤
試驗(yàn)4: 當(dāng)前作用域無(wú)法使用其它作用域內(nèi)的變量
public class Demo3_warning4{
public static void main(String[] args){
// 4,在不同的作用域中,變量不能互相使用
{
//Block1中定義一個(gè)變量
String strInBlock1 = "hello java";
}
{
//Block2中是否可以使用
System.out.println(strInBlock1);
}
}
}
? 運(yùn)行結(jié)果:
D:\OnlineEdu\Task02 數(shù)據(jù)類型 運(yùn)算符\code>javac Demo03_warning4.java
Demo03_warning4.java:10: 錯(cuò)誤: 找不到符號(hào)
System.out.println(strInBlock1);
^
符號(hào): 變量 strInBlock1
位置: 類 Demo03_warning4
1 個(gè)錯(cuò)誤
試驗(yàn)5: 變量可以同時(shí)定義,但是初始化賦值只能單獨(dú)的
public class Demo03_warning5{
public static void main(String[] args){
//方式1: 一行定義并初始化多個(gè)變量
int x2=10,y2=20,z2=30;
//方式2: 定義和初始化分開(kāi)
//1,定義多個(gè)變量一行定義多個(gè)變量
int x1,y1,z1;
//2,分別初始化多個(gè)變量
x1=10;y1=20;z1=30; //寫(xiě)在一行和不寫(xiě)在一行沒(méi)區(qū)別, 有分號(hào)就相當(dāng)于分在三行.
//錯(cuò)誤的寫(xiě)法: 但是不能如下這樣
int x3,y3,z3 = 10,20,30;
}
}
? 運(yùn)行結(jié)果
D:\OnlineEdu\Task02 數(shù)據(jù)類型 運(yùn)算符\code>javac Demo03_warning5.java
Demo03_warning5.java:14: 錯(cuò)誤: 需要<標(biāo)識(shí)符>
int x3,y3,z3 = 10,20,30;
^
1 個(gè)錯(cuò)誤
第二節(jié) Java數(shù)據(jù)類型
2.1 概述
? 有沒(méi)有想過(guò)一個(gè)問(wèn)題: 程序在內(nèi)存中運(yùn)行的時(shí)候, CPU處理的所有數(shù)據(jù)都統(tǒng)一成一種類型不可以嗎? 為什么要給數(shù)據(jù)劃分類型? 為什么還要?jiǎng)澐殖苫镜? 復(fù)雜的多種類型呢?
? 答案: 如果幾百個(gè)G的數(shù)據(jù)到加載到內(nèi)存中, 還有可能實(shí)現(xiàn), 幾百個(gè)TB或者幾百個(gè)PB的數(shù)據(jù)呢? 所以, 內(nèi)存永遠(yuǎn)是不夠大的, 針對(duì)不同的數(shù)據(jù)分配不同大小的內(nèi)存空間, 實(shí)際是為了節(jié)省內(nèi)存空間. 這個(gè)不同大小的空間體現(xiàn)在你寫(xiě)程序的時(shí)候, 就是不同的數(shù)據(jù)類型.
2.2 變量種類
基本數(shù)據(jù)類型: (四類,八種)
- 整形 byte(1), short(2), int(4), long(8) 默認(rèn)類型int類型
- 浮點(diǎn)型 float(4), double(8) 默認(rèn)類型double類型
- 字符型 char(2)
- 布爾型 boolean(1)
復(fù)雜數(shù)據(jù)類型, 引用數(shù)據(jù)類型:
- 類
- 數(shù)組,字符串
- 接口
操作: 練習(xí)定義并使用各種類型的變量
2.3 注意事項(xiàng)
? 1, 整形數(shù)據(jù)類型默認(rèn)為int類型
? 2, 浮點(diǎn)型的數(shù)據(jù)類型默認(rèn)為double類型
在定義long型的時(shí)候,想要表示long型,那么值后面加一個(gè)字母l或者L
在定義float型的時(shí)候,為了表示float型,那么值后面加一個(gè)字母f或者F
第三節(jié) Java數(shù)據(jù)類型轉(zhuǎn)換
3.1 概述
? 為什么要進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換?
? 直觀來(lái)看, 進(jìn)行一個(gè)賦值操作 int num = 3.14;發(fā)現(xiàn)賦值運(yùn)算符=兩邊的數(shù)據(jù)類型的不統(tǒng)一的. 一個(gè)是int另外一個(gè)是float.計(jì)算機(jī)要如何操作呢, 罷工嗎?
? 遇到兩邊取值范圍(本質(zhì)上是兩種類型的數(shù)據(jù)占用內(nèi)存空間不一樣大), Java定義了兩種類型轉(zhuǎn)換的方式.
3.2 類型轉(zhuǎn)換的種類
-
? 自動(dòng)類型轉(zhuǎn)換
也被稱作隱式類型轉(zhuǎn)換, 由Java自動(dòng)完成, 條件是賦值運(yùn)算符的左邊為大范圍類型, 右邊是小范圍類型
語(yǔ)法格式: 大類型 變量名 = 小類型;
// java會(huì)自動(dòng)將10這個(gè)int常量轉(zhuǎn)換為long類型賦值給amount變量 long amount = 10; //左邊是long類型, 右邊是int類型 //long amount = 10L; //常量使用L結(jié)尾標(biāo)識(shí)后, 這樣才是兩邊數(shù)據(jù)類型一致 // java會(huì)自動(dòng)將100這個(gè)int常量轉(zhuǎn)換為float類型賦值給number變量 float number = 100; //左邊是float類型, 右邊是int類型 //float number = 100F; //常量使用F結(jié)尾標(biāo)識(shí)后, 代表這是一個(gè)float型常量, 兩邊數(shù)據(jù)類型一致
-
? 強(qiáng)制類型轉(zhuǎn)換
上面是將小數(shù)據(jù)范圍的數(shù)賦值給大數(shù)據(jù)范圍的變量, 沒(méi)有什么數(shù)值損失, 反之呢?這就需要我們程序員強(qiáng)制轉(zhuǎn)換了, java不會(huì)自動(dòng)承擔(dān)這個(gè)類型轉(zhuǎn)換帶來(lái)的后果. 于是強(qiáng)制轉(zhuǎn)換需要我們程序員明確操作.
語(yǔ)法格式: 小數(shù)據(jù)類型 變量名 = (小數(shù)據(jù)范圍類型) 大數(shù)據(jù)類型范圍的數(shù)據(jù)
首先測(cè)試, 程序員不采取任何操作什么現(xiàn)象
public class Demo04_dataType2{ public static void main(String[] args){ //大范圍的float類型常量3.14,賦值給小范圍的變量number int number = 3.14F; } }運(yùn)行結(jié)果:
不兼容的類型: 從float轉(zhuǎn)換到int可能會(huì)有損失這就是前面說(shuō)的, java不給你承擔(dān)損失, 拋出錯(cuò)誤.D:\OnlineEdu\Task02 數(shù)據(jù)類型 運(yùn)算符\code>javac Demo04_dataType2.java Demo04_dataType2.java:4: 錯(cuò)誤: 不兼容的類型: 從float轉(zhuǎn)換到int可能會(huì)有損失 int number = 3.14F; ^ 1 個(gè)錯(cuò)誤正確的方式
public class Demo04_dataType2{ public static void main(String[] args){ //大范圍的float類型常量3.14,賦值給小范圍的變量number int number = (int)3.14F; System.out.println(number); } }運(yùn)行結(jié)果
D:\OnlineEdu\Task02 數(shù)據(jù)類型 運(yùn)算符\code>javac Demo04_dataType2.java D:\OnlineEdu\Task02 數(shù)據(jù)類型 運(yùn)算符\code>java Demo04_dataType2 3結(jié)果解析: 經(jīng)過(guò)強(qiáng)制類型轉(zhuǎn)換, java會(huì)確定程序員對(duì)精度損失的結(jié)果是有考慮的.
3.3 注意事項(xiàng)
? 1, 一般不要輕易使用強(qiáng)制類型轉(zhuǎn)換(除非避免不了),因?yàn)闀?huì)出現(xiàn)精度損失,數(shù)據(jù)溢出.
? 2, 特別注意: byte,short,char參加算術(shù)運(yùn)算, 但是在沒(méi)有超范圍的情況下,會(huì)首先被提升為int
? byte num1 = 10;
? byte num2 = 20;
? byte sum = num1+num2
? 這里第三行會(huì)出現(xiàn)問(wèn)題: 首先num1+num2的時(shí)候會(huì)自動(dòng)提升為int類型
? char a = 'A'
? 當(dāng)char類型參加運(yùn)算的時(shí)候,會(huì)去ASCII碼表中,尋找char類型數(shù)據(jù)對(duì)應(yīng)的整數(shù)
字符碼表是什么?
ASCII碼表? 美國(guó)人整的,每個(gè)字符都對(duì)應(yīng)了一個(gè)整數(shù),128個(gè)字符表示
UNICODE碼表:萬(wàn)國(guó)碼表,包含了所有國(guó)家的字符注意: char數(shù)據(jù)類型在運(yùn)算時(shí)候會(huì)被自動(dòng)轉(zhuǎn)換為int,再去參加運(yùn)算
第四節(jié) 運(yùn)算符
4.1 種類
? 算術(shù)運(yùn)算符、賦值運(yùn)算符、比較運(yùn)算符、邏輯運(yùn)算符、三目運(yùn)算符
4.2 算術(shù)運(yùn)算符
| 種類 | 符號(hào) | 舉例 |
|---|---|---|
| 加 | + | 1+1, num1+num2 (除去加法這種算術(shù)運(yùn)算, 還用來(lái)做字符串拼接) |
| 減 | - | 2-1, num1- num2 |
| 乘 | * | 10 * 10, num1 * num2 |
| 除 | / | 101 / 10, num1 / num2 (作用保留整數(shù)部分, 除數(shù)不能為0) |
| 求余取模 | % | 101 % 10 , num1 % num2 (作用求余數(shù)) |
| 自加 | ++i | 變量++i ( 作用先自加1, 再參與運(yùn)算 ) |
| 自減 | --i | 變量 --i ( 作用先自減1, 再參與運(yùn)算 ) |
| 自加 | i++ | 變量 i++ ( 作用先參與其它運(yùn)算, 后自加1 ) |
| 自減 | i-- | 變量 i-- ( 作用先參與其它運(yùn)算, 后自減1 ) |
注意:
? 1, 自加自減
? 2, 字符串與其它數(shù)據(jù)類型的拼接運(yùn)算
4.3 賦值運(yùn)算符
分類: 1, 基本賦值; 2, 復(fù)合賦值.
| 種類 | 符號(hào) | 舉例 |
|---|---|---|
| 基本賦值 | = | num = 100; |
| 加賦值 | += | num += 1; 等價(jià)于 num = num +1; |
| 減賦值 | -= | num -= 10; 等價(jià)于 num = num -10; |
| 乘賦值 | *= | num *= 5; 等價(jià)于 num = num * 5 |
| 除賦值 | /= | num /= 10; 等價(jià)于 num = num /10; |
| 模賦值 | %= | num %= 10; 等價(jià)于 num = num %10; |
注意:
? byte,short,char在參與運(yùn)算的時(shí)候,會(huì)被提升為int類型
? byte num1 = 125;
? byte num2 = 125;
? byte result = 0;
? result = num1+num2;
? System.out.println(result);
? 倒數(shù)第二行就會(huì)出現(xiàn)錯(cuò)誤: 不兼容的類型: 從int轉(zhuǎn)換到byte可能會(huì)有損失
? 但是在復(fù)合賦值中:byte,short,char在參與運(yùn)算的時(shí)候,不用程序員手動(dòng)強(qiáng)制類型轉(zhuǎn)換
4.4 比較運(yùn)算符
作用: 如果比較的結(jié)果為真, 返回true; 反之結(jié)果返回false.
| 種類 | 符號(hào) | 舉例 |
|---|---|---|
| 相等比較 | == | |
| 大于比較 | > | |
| 小于比較 | < | |
| 大于等于比較 | >= | |
| 小于等于比較 | <= | |
| 不等比較 | != |
4.5 邏輯運(yùn)算符
| 種類 | 符號(hào) | 舉例 |
|---|---|---|
| 短路與 | && | i>0 && i<100 作用: 如果與判斷左邊為false, 右邊不做判斷 |
| 短路或 | || | gender=="男" || age<35 作用: 如果與判斷左邊為true, 右邊不做判斷 |
| 非 | ! | ! true, !(name==null) 作用: !true=false; !false = true |
| 與 | & | i>0 & i<100 作用: 無(wú)論左邊是true還是false, 都計(jì)算右邊 |
| 或 | | | gender=="男"| age<35 作用: 無(wú)論左邊是true還是false, 都計(jì)算右邊 |
4.6 三目運(yùn)算符
語(yǔ)法: 布爾表達(dá)式?表達(dá)式1:表達(dá)式2
流程:
? 計(jì)算布爾表達(dá)式的邏輯值
? 如果是true,執(zhí)行表達(dá)式1;
? 如果是false,執(zhí)行表達(dá)式2
例子: 判斷分?jǐn)?shù)是否及格?
int score = 100;
String result = score>=60 ? "及格" : "不及格";
System.out.println(result);