這篇文章為你搞懂2個問題
- java 中有哪些資料型別可以用儲存資料?
- java 中的資料型別是怎麼轉換的?
在上一篇文章中我們學會了如何使用變數,像這樣儲存一個整數 int age=10;
,可以在開發工具中編寫一行這樣的程式碼 int age=10.5;
就會發現開發工具報錯了,是因為變數中的資料型別也是不能隨便用的。
資料型別
我們們先來看下面一組資料
如果每天花費2小時在交通上
1月=60小時=2.5天,
1年=730小時=30天,
50年=36500小時=1520天=4年
這段資料中可以分為以下2類,java中也包含這2大類
- 數值
1月
中的1
60小時
中的60
2.5
天中2.5
- 非數值
,
年
月
小時
- 數值
- 整型
- byte
- short
- int
- long
- 浮點型
- float
- double
- 整型
- 非數值
- char
- boolean
- String
數值型
下面看一下每個資料型別的詳細介紹
資料型別 | 大小 | 取值範圍 | 介紹 |
---|---|---|---|
byte | 1位元組8位 | -128 ~ +127 | 位元組型 這個範圍可以儲存普通人的年齡 |
short | 2位元組16位 | -32768~+3276 | 短整型 |
int | 4位元組32位 | -2147483648)~+2147483647 | 整型 存下中國人口的數量沒有問題,但是存下地球所有人的數量就不夠了 |
long | 8位元組64位 | -2^63 ~ + 2^63-1 | 長整型 存下地球的人數綽綽有餘 |
float | 4位元組32位 | 單精度浮點數 儲存小數 | |
double | 8位元組64位 | 雙精度浮點數 |
敲一敲:
public class DemoType {
public static void main(String[] args) {
//int型別使用
int numa=10+1;
System.out.println(numa);//輸出11
short numb=20;
//使用long型別時的值需要使用L作為字尾
long time=9223372036854775807L;
}
}
複製程式碼
在使用 long 型別時使用不區分大小寫的 L 作為字尾標記與整型進行區分
使用其他整數時不需加字尾符號,注意賦值的整數不超過型別範圍即可
敲一敲:
public class DemoFloat {
public static void main(String[] args) {
float money=33.6f;
double length=55.07;
}
}
複製程式碼
在使用單精度浮點數時需加上
f
作為字尾,這是因為任何小數都會被認為是double
在日常使用中建議使用double
型別防止精度的丟失
非數值型
字元型 char
只能儲存一個字元,值需要用一對單引號引起來,且單引號中只能放一個字元
敲一敲:
char sex='男';
複製程式碼
字串型 String
用於儲存一串字元,必須用一對雙引號引起來,另外需要注意的是 String 不是基本資料型別,而是 java 中的另一個概念 類
。
敲一敲:
String username="極客大全";
String question="What's your name?\nHow old are you?";
複製程式碼
String
型別用於儲存字串,字串可以拼接但不能用於數學運算- 還可以使用一些
轉義字元
,這些字元可以用來表示一些特殊符號像 空格、換行
\n
可以用來表示換行,之後的內容會另起一行
\t
可以表示一個製表符(Tab
鍵)
布林型 boolean
用於儲存邏輯的結果,如:大象比人大的結果是真(true
) 人比螞蟻小的結果是假(false
)
敲一敲:
boolean isbig=(1>10);
System.out.println("isbig:"+isbig);
boolean isequal=(100==3);
System.out.println("isequal:"+isbig);
boolean flag=false;
System.out.println("flag:"+flag);
複製程式碼
boolean
型別的變數只能儲存兩個值true
或false
還可以將邏輯比較後的結果(也是true
或false
)存入
資料型別轉換
隱式型別轉換
二花一個月前稱的體重為97.5斤,現在比一個月前剛好增加2斤,二花現在是多少斤?這是一個比較簡單的數學問題,正確結果是 99.5 斤,下面我們用程式碼來模擬一遍。
敲一敲:
public class DemoClac {
public static void main(String[] args) {
double weight=97.5;//一個月前的體重
int add=2;//增加的體重
double sum=weight+add;
System.out.println(sum);//輸出和
}
}
複製程式碼
add 變數是一個整數型別,而 weight 是一個小數,兩者在相加後轉成了 double型別
這時發生的就是隱式型別轉換
隱式型別轉換
就是自動型別轉換,滿足以下兩個規則即可發生
- 如果一個運算元為double型別,則整個表示式可提升為double型別
像上面的這個示例就是滿足這個規則
- 滿足自動型別轉換的條件:兩種型別要相容、目標型別大於源型別
例子1 :double a=1;
1屬於整型,double 型別大於整型,即自動轉換
例子2 :
char chr=97;
System.out.println(chr);//輸出字元 a
複製程式碼
char 型別相容 int 型別,每個整數存入char型別變數時都會對映一個字元,更多可以百度 ASCII
強制型別轉換
敲一敲:
int sum=55.3+22;
System.out.println(sum);
複製程式碼
我們想要一個整數的和,但上面的這段程式碼執行時會報錯:cannot convert from double to int
這是為什麼呢?根據前面學到的隱式型別轉換,當表示式中有運算元為 double型別時,整個表示式提升為 double,必須進行顯式強制型別轉換。
敲一敲:
int sum=(int) (55.3+22);
System.out.println(sum);
複製程式碼
這次的執行成功,執行的結果為 77
強制型別轉換往往是從寬度大的型別轉換為寬度小的型別,會使數值損失精度
試一試
- 下面運算的結果是多少?為什麼?
int a=5;
int b=2;
int c=a/5;
System.out.println(c);
複製程式碼
- 上一個練習中的程式碼如何讓運算結果更精準?
- 下面素材中生成隨機小數,修改素材生成 1-10 的隨機整數
public class DemoRandom {
public static void main(String[] args) {
double random=Math.random();
System.out.println(random);
}
}
複製程式碼
搜尋關注公眾號「享智同行」,第一時間獲取技術乾貨