Java資料類型轉換、運算符、方法
-
-
- 一、資料類型轉換
-
- 1.1 自動轉換
- 1.2 強制轉換
- 1.3 ASCII編碼表
- 二、運算符
-
- 2.1 算數運算符
- 2.2 指派運算符
- 2.3 比較運算符
- 2.4 邏輯運算符
- 2.5 三元運算符
- 三、方法入門
-
- 3.1 概述
- 3.2 方法的定義
- 3.3 方法的調用
- 3.4 注意事項
-
一、資料類型轉換
Java
程式中要求參與的計算的資料,必須要保證資料類型的一緻性,如果資料類型不一緻将發生類型的轉換。
1.1 自動轉換
一個
int
類型變量和一個
byte
類型變量進行加法運算, 結果會是什麼資料類型?
int i = 1;
byte b = 2;
運算結果,變量的類型将是
int
類型,這就是出現了資料類型的自動類型轉換現象。
- 自動轉換:将 取值範圍小的類型自動提升為取值範圍大的類型 。
public static void main(String[] args) { int i = 1; byte b = 2; //byte x = b + i; // 報錯 //int類型和byte類型運算,結果是int類型 int j = b + i; System.out.println(j); } //結果 3
同樣道理,當一個
int
類型變量和一個
double
變量運算時,
int
類型将會自動提升為
double
類型進行運算。
public static void main(String[] args) {
int i = 1;
double d = 2.5;
//int類型和double類型運算,結果是double類型
//int類型會提升為double類型
double e = d + i;
System.out.println(e);
}
//結果
3.5
轉換規則:
範圍小的類型向範圍大的類型提升,
byte
、
short
、
char
運算時直接提升為
int
。
1.2 強制轉換
将 1.5 指派到
int
類型變量會發生什麼?産生編譯失敗,肯定無法指派。
double
類型記憶體8個位元組,
int
類型記憶體4個位元組。 1.5 是
double
類型,取值範圍大于
int
。想要指派成功,隻有通過強制類型轉換,将
double
類型強制轉換成
int
類型才能指派。
- 強制類型轉換:将取值範圍大的類型 強制轉換成取值範圍小的類型 。 比較而言,自動轉換是
自動執行的,而強制轉換需要我們自己手動執行。Java
轉換格式:
資料類型 變量名 = (資料類型)被轉資料值;
将 1.5 指派到
int
類型,代碼修改為:
// double類型資料強制轉成int類型,直接去掉小數點。
int i = (int)1.5;
同樣道理,當一個
short
類型與 1 相加,我們知道會類型提升,但是還想給結果指派給
short
類型變量,就需要強制轉換。
public static void main(String[] args) {
//short類型變量,記憶體中2個位元組
short s = 1;
/*出現編譯失敗
s和1做運算的時候,1是int類型,s會被提升為int類型
s+1後的結果是int類型,将結果在指派會short類型時發生錯誤
short記憶體2個位元組,int類型4個位元組
必須将int強制轉成short才能完成指派
*/
//s = s + 1;//編譯失敗
//編譯成功
s = (short) (s + 1);
}
強烈注意:
- 浮點轉成整數,直接取消小數點,可能造成資料損失精度。
-
強制轉成int
砍掉2個位元組,可能造成資料丢失。short
// 定義s為short範圍内最大值 short s = 32767; // 運算後,強制轉換,砍掉2個位元組後會出現不确定的結果 s = (short)(s + 10);
1.3 ASCII編碼表
public static void main(String[] args) {
//字元類型變量
char c = 'a';
int i = 1;
//字元類型和int類型計算
System.out.println(c+i);
}
//輸出結果
98
在計算機的内部都是二進制的0、1資料,如何讓計算機可以直接識别人類文字的問題呢?就産生出了編碼表的概念。
- 編碼表 :就是将人類的文字和一個十進制數進行對應起來組成一張表格。
- 将所有的英文字母,數字,符号都和十進制進行了對應,是以産生了世界上第一張編碼表
。ASCII
在char類型和int類型計算的過程中,char類型的字元先查詢編碼表,得到97,再和1求和,結果為98。char類型提升 為了int類型。char類型記憶體2個位元組,int類型記憶體4個位元組。
二、運算符
2.1 算數運算符
算數運算符 | 描述 |
---|---|
| 加法運算,字元串連接配接運算 |
| 減法運算 |
| 乘法運算 |
| 除法運算 |
| 取模運算,兩個數字相除取餘數 |
| 自增自減運算 |
Java
中,整數使用以上運算符,無論怎麼計算,也不會得到小數。
public static void main(String[] args) {
int i = 1234;
System.out.println(i/1000*1000);
}
//計算結果
1000
-
運算,變量自己增長1。反之,++
運算,變量自己減少1,用法與--
一緻。++
- 獨立運算:
- 變量在獨立運算時, 前
和 後++
沒有差別 。++
- 變量前
:例如++
。++i
- 變量 後
:例如++
。i++
- 變量在獨立運算時, 前
- 混合運算:
- 和其他變量放在一起, 前
和後++
就産生了不同。++
- 變量前
:變量++
自己加1,将加1後的結果指派給a
,也就是說b
先計算。a
和a
的結果都是2。b
public static void main(String[] args) { int a = 1; int b = a++; System.out.println(a);//計算結果是2 System.out.println(b);//計算結果是1 }
- 和其他變量放在一起, 前
- 獨立運算:
-
符号在字元串中的操作:+
-
符号在遇到字元串的時候,表示連接配接、拼接的含義。+
- “a”+"b"的結果是“ab”,連接配接含義。
public static void main(String[] args){ System.out.println("5+5="+5+5);//輸出5+5=55 }
-
拓展:
-
+=
符号的擴充
下面的程式有問題嗎?
分析:public static void main(String[] args){ short s = 1; s+=1; System.out.println(s); }
邏輯上看作是s += 1
計算結果被提升為s = s + 1
類型,再向short類型指派時發生錯誤,因為不能将取值範圍 大的類型指派到取值範圍小的類型。但是,int
進行兩次運算 ,s=s+1
是一個運算符,隻運算一次,并帶有強制轉換的特點, 也就是說+=
就是s += 1
,是以程式沒有問題編譯通過,運作結果是2.s = (short)(s + 1)
-
常量和變量的運算
下面的程式有問題嗎?
分析:public static void main(String[] args){ byte b1=1; byte b2=2; byte b3=1 + 2; byte b4=b1 + b2; System.out.println(b3); System.out.println(b4); }
, 1 和 2 是常量,為固定不變的資料,在編譯的時候(編譯器b3 = 1 + 2
),已經确定了javac
的結果并沒有超過1+2
類型的取值範圍,可以指派給變量byte
,是以b3
是正确的。 反之,b3=1 + 2
,b4 = b2 + b3
和b2
是變量,變量的值是可能變化的,在編譯的時候,編譯器javac不确定b3
的結果是什 麼,是以會将結果以b2+b3
類型進行處理,是以int
類型不能指派給int
類型,是以編譯失敗。byte
2.2 指派運算符
指派運算符 | 描述 |
---|---|
| 等于号 |
| 加等于 |
| 減等于 |
| 乘等于 |
| 除等于 |
| 取模等 |
- 指派運算符,就是将符号右邊的值,賦給左邊的變量。
public static void main(String[] args){
int i = 5;
i+=5;//計算方式 i=i+5 變量i先加5,再指派變量i
System.out.println(i); //輸出結果是10
}
2.3 比較運算符
比較運算符 | 描述 |
---|---|
| 比較符号兩邊資料是否相等,相等結果是 。 |
| 比較符号左邊的資料是否小于右邊的資料,如果小于結果是 。 |
| 比較符号左邊的資料是否大于右邊的資料,如果大于結果是 。 |
| 比較符号左邊的資料是否小于或者等于右邊的資料,如果小于結果是 。 |
| 比較符号左邊的資料是否大于或者等于右邊的資料,如果小于結果是 。 |
| 不等于符号 ,如果符号兩邊的資料不相等,結果是 。 |
- 比較運算符,是兩個資料之間進行比較的運算,運算結果都是布爾值
或者true
。false
public static void main(String[] args) { System.out.println(1==1);//true System.out.println(1<2);//true System.out.println(3>4);//false System.out.println(3<=4);//true System.out.println(3>=4);//false System.out.println(3!=4);//true }
2.4 邏輯運算符
比較運算符 | 描述 |
---|---|
短路與 | 1. 兩邊都是 ,結果是t 2. 一邊是 ,結果是 短路特點:符号左邊是 ,右邊不再運算 。 |
短路或 | 1. 兩邊都是 ,結果是 2. 一邊是t ,結果是 短路特點: 符号左邊是 ,右邊不再運算 。 |
取反 | 1. 結果是 2. 結果是 。 |
- 邏輯運算符,是用來連接配接兩個布爾類型結果的運算符,運算結果都是布爾值
或者true
。false
public static void main(String[] args) { System.out.println(true && true);//true System.out.println(true && false);//false System.out.println(false && true);//false,右邊不計算 System.out.println(false || false);//falase System.out.println(false || true);//true System.out.println(true || false);//true,右邊不計算 System.out.println(!false);//true }
2.5 三元運算符
- 三元運算符格式:
- 三元運算符計算方式:
- 布爾類型表達式結果是
,三元運算符整體結果為結果1,指派給變量。true
- 布爾類型表達式結果是
,三元運算符整體結果為結果2,指派給變量。false
public static void main(String[] args) { int i = (1==2 ? 100 : 200); System.out.println(i);//200 int j = (3<=4 ? 500 : 600); System.out.println(j);//500 }
- 布爾類型表達式結果是
三、方法入門
3.1 概述
我們在學習運算符的時候,都為每個運算符單獨的建立一個新的類和
main
方法,我們會發現這樣編寫代碼非常的繁瑣,而且 重複的代碼過多。能否避免這些重複的代碼呢,就需要使用方法來實作。
- 方法:就是将一個功能抽取出來,把代碼單獨定義在一個大括号内,形成一個單獨的功能。
當我們需要這個功能的時候,就可以去調用。這樣即實作了代碼的複用性,也解決了代碼備援的現象。
3.2 方法的定義
- 定義格式:
修飾符 傳回值類型 方法名 (參數清單){ 代碼... return ; }
- 定義格式解釋:
- 修飾符: 目前固定寫法
。public static
- 傳回值類型: 目前固定寫法
,其他傳回值類型在後面的課程講解。void
- 方法名:為我們定義的方法起名,滿足辨別符的規範,用來調用方法。
- 參數清單: 目前無參數。
-
:方法結束。因為傳回值類型是return
,方法大括号内的void
可以不寫。return
public static void methodName() { System.out.println("這是一個方法"); }
- 修飾符: 目前固定寫法
3.3 方法的調用
方法在定義完畢後,方法不會自己運作,必須被調用才能執行,我們可以在主方法
main
中來調用我們自己定義好的方法。在 主方法中,直接寫要調用的方法名字就可以調用了。
public static void main(String[] args) {
//調用定義的方法method
method();
}
//定義方法,被main方法調用
public static void method() {
System.out.println("自己定義的方法,需要被main調用運作");
}
将三元運算符代碼抽取到自定義的方法中,并調用。
public static void main(String[] args) {
//調用定義的方法operator
operator();
}
//定義方法,方法中定義三元運算符
public static void operator() {
int i = 0;
i = (1==2 ? 100:200);
System.out.println(i);
int j = 0 ;
j = (3<=4 ? 500:600);
System.out.println(j);
}
3.4 注意事項
- 方法定義注意事項:
- 方法必須定義在一類中方法外 。
- 方法不能定義在另一個方法的裡面。
public class Demo { public static void main(String[] args){ } //正确寫法,類中,main方法外面可以定義方法 public static void method(){} }
public class Demo { public static void main(String[] args){ //錯誤寫法,一個方法不能定義在另一方法内部 public static void method(){} } }