一、 數據類型轉換
Java程序中要求參與的計算的數據,必須要保證數據類型的一致性,如果數據類型不一致將發生類型的轉換。
一個 int 類型變量和一個 byte 類型變量進行加法運算, 結果會是什麼數據類型?
int i = 1;byte b = 2;
運算結果,變量的類型將是 int 類型,這就是出現了數據類型的自動類型轉換現象。
1. 自動轉換
概念:將 取值範圍小的類型自動提升爲取值範圍大的類型。
public static void main (String[] args){
int i =1;
byte b =2;
//byte j = i + b;//報錯,除非進行類型的強轉
//int類型和byte類型運算,結果是int類型
int j = i + b;
System.out.println(j);
}
轉換原理圖解
byte 類型內存佔有1個字節,在和 int 類型運算時會提升爲 int 類型 ,自動補充3個字節,因此計算後的結果還是 int 類 型。
同樣道理,當一個 int 類型變量和一個 double 變量運算時, int 類型將會自動提升爲 double 類型進行運算。
public static void main(String[] args) {
int a = 1; double b = 3.5;
//int類型和double類型運算,結果是double類型
//int類型會提升爲double類型
double e = a+b;
System.out.println(e);
}
轉換規則
範圍小的類型向範圍大的類型提升, byte、short、char 運算時直接提升爲 int 。
byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double
2. 強制轉換
概念:將取值範圍大的類型強制轉換成取值範圍小的類型 。
將 1.5 賦值到 int 類型變量會發生什麼?產生編譯失敗,肯定無法賦值。
int i = 1.5; // 錯誤
double 類型內存8個字節, int 類型內存4個字節。 1.5 是 double 類型,取值範圍大於 int 。可以理解爲 double 是8 升的水壺, int 是4升的水壺,不能把大水壺中的水直接放進小水壺去。
想要賦值成功,只有通過強制類型轉換,將 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 強制轉成 short 砍掉2個字節,可能造成數據丟失。
// 定義s爲short範圍內最大值
short s = 32767;
// 運算後,強制轉換,砍掉2個字節後會出現不確定的結果
s = (short)(s + 10);
3. ASCII編碼表
public static void main(String[] args) {
//字符類型變量
char c = 'a';
int i = 1;
//字符類型和int類型計算
System.out.println(c+i);//輸出結果是98
}
在計算機的內部都是二進制的0、1數據,如何讓計算機可以直接識別人類文字的問題呢?就產生出了編碼表的概念。
編碼表 :就是將人類的文字和一個十進制數進行對應起來組成一張表格。
將所有的英文字母,數字,符號都和十進制進行了對應,因此產生了世界上第一張編碼表ASCII( American Standard Code for Information Interchange 美國標準信息交換碼)。
小貼士: 在char類型和int類型計算的過程中,char類型的字符先查詢編碼表,得到97,再和1求和,結果爲98。char類型提升 爲了int類型。char類型內存2個字節,int類型內存4個字節.
二、運算符
1. 算數運算符
Java中,整數使用以上運算符,無論怎麼計算,也不會得到小數。
public static void main(String[] args) {
int i = 1234;
System.out.println(i/1000*1000);//計算結果是1000
}
++ 運算,變量自己增長1。反之, – 運算,變量自己減少1,用法與 ++ 一致。
獨立運算:
變量在獨立運算時, 前++ 和 後++ 沒有區別 。
變量 前++ :例如 ++i 。
變量 後++ :例如 i++ 。
混合運算:
和其他變量放在一起, 前++ 和 後++ 就產生了不同。
變量 前++ :變量a自己加1,將加1後的結果賦值給b,也就是說a先計算。a和b的結果都是2。
public static void main(String[] args) {
int a = 1;
int b = ++a;
System.out.println(a);//計算結果是2
System.out.println(b);//計算結果是2
}
變量 後++ :變量a先把自己的值1,賦值給變量b,此時變量b的值就是1,變量a自己再加1。a的結果是2,b 的結果是1。
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("6+6="+6+6);//輸出6+6=66
}
2. 賦值運算符
- 賦值運算符,就是將符號右邊的值,賦給左邊的變量。
public static void main(String[] args){
int i = 5;
i+=5;//計算方式 i=i+5 變量i先加5,再賦值變量i
System.out.println(i); //輸出結果是10
}
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
}
4. 邏輯運算符
- 邏輯運算符,是用來連接兩個布爾類型結果的運算符,運算結果都是布爾值 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);//false
System.out.println(false || true);//true
System.out.println(true || false);//true,右邊不計算
System.out.println(!false);//true
}
5. 三元運算符
-
三元運算符格式:
數據類型 變量名 = 布爾類型表達式?結果1:結果2
-
三元運算符計算方式:
布爾類型表達式結果是true,三元運算符整體結果爲結果1,賦值給變量。
布爾類型表達式結果是false,三元運算符整體結果爲結果2,賦值給變量。
public static void main(String[] args) {
int i = (1==2 ? 10 : 20);
System.out.println(i);//20
int j = (3<=4 ? 50 : 60);
System.out.println(j);//50
}
三、方法入門
1. 概述
我們在學習運算符的時候,都爲每個運算符單獨的創建一個新的類和main方法,我們會發現這樣編寫代碼非常的繁瑣,而且 重複的代碼過多。能否避免這些重複的代碼呢,就需要使用方法來實現。
- 方法:就是將一個功能抽取出來,把代碼單獨定義在一個大括號內,形成一個單獨的功能。
當我們需要這個功能的時候,就可以去調用。這樣即實現了代碼的複用性,也解決了代碼冗餘的現象。
2. 方法的定義
-
定義格式:
修飾符 返回值類型 方法名 (參數列表){ 代碼... return ; }
-
定義格式解釋:
- 修飾符: 目前固定寫法 public static 。
- 返回值類型: 目前固定寫法 void ,其他返回值類型在後面的課程講解。
- 方法名:爲我們定義的方法起名,滿足標識符的規範,用來調用方法。
- 參數列表: 目前無參數, 帶有參數的方法在後面的課程講解。
- return:方法結束。因爲返回值類型是void,方法大括號內的return可以不寫。
-
舉例:
public static void methodName() {
System.out.println("這是一個方法");
}
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);
}
- 注意事項
- 方法定義注意事項:
- 方法必須定義在一類中方法外
- 方法不能定義在另一個方法的裏面
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(){}
}
}
4.補充說明
- +=符號的擴展
下面的程序有問題嗎?
public static void main(String[] args){
short s = 1;
s+=1;
System.out.println(s);
}
分析: s += 1 邏輯上看作是 s = s + 1 計算結果被提升爲int類型,再向short類型賦值時發生錯誤,因爲不能將取值範圍 大的類型賦值到取值範圍小的類型。但是, s=s+1進行兩次運算 , += 是一個運算符,只運算一次,並帶有強制轉換的特點, 也就是說 s += 1 就是 s = (short)(s + 1) ,因此程序沒有問題編譯通過,運行結果是2.
- 常量和變量的運算
下面的程序有問題嗎?
public static void main(String[] args){
byte b1=1;
byte b2=2;
byte b3=1 + 2;
byte b4=b2 + b3;
System.out.println(b3);
System.out.println(b4);
}
分析: b3 = 1 + 2 , 1 和 2 是常量,爲固定不變的數據,在編譯的時候(編譯器javac),已經確定了 1+2 的結果並沒 有超過byte類型的取值範圍,可以賦值給變量 b3 ,因此 b3=1 + 2 是正確的。
反之, b4 = b2 + b3 , b2 和 b3 是變量,變量的值是可能變化的,在編譯的時候,編譯器javac不確定b2+b3的結果是什 麼,因此會將結果以int類型進行處理,所以int類型不能賦值給byte類型,因此編譯失敗。
客官既然來了,點個贊再走唄,關注博主不迷路,哈哈哈~