Java入門系列-05-資料型別和型別轉換

要成為王的男人發表於2018-10-10

這篇文章為你搞懂2個問題

  1. java 中有哪些資料型別可以用儲存資料?
  2. 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月 中的 1
    60小時 中的 60
    2.5 天中 2.5
  2. 非數值
    , 小時
  • 數值
    • 整型
      • 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?";
複製程式碼
  1. String 型別用於儲存字串,字串可以拼接但不能用於數學運算
  2. 還可以使用一些 轉義字元 ,這些字元可以用來表示一些特殊符號像 空格、換行
    \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 型別的變數只能儲存兩個值 truefalse
還可以將邏輯比較後的結果(也是 truefalse)存入

資料型別轉換

隱式型別轉換

二花一個月前稱的體重為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型別
這時發生的就是 隱式型別轉換

隱式型別轉換 就是自動型別轉換,滿足以下兩個規則即可發生

  1. 如果一個運算元為double型別,則整個表示式可提升為double型別

像上面的這個示例就是滿足這個規則

  1. 滿足自動型別轉換的條件:兩種型別要相容、目標型別大於源型別

例子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

強制型別轉換往往是從寬度大的型別轉換為寬度小的型別,會使數值損失精度

試一試

  1. 下面運算的結果是多少?為什麼?
int a=5;
int b=2;
int c=a/5;
System.out.println(c);
複製程式碼
  1. 上一個練習中的程式碼如何讓運算結果更精準?
  2. 下面素材中生成隨機小數,修改素材生成 1-10 的隨機整數
public class DemoRandom {
	public static void main(String[] args) {
		double random=Math.random();
		System.out.println(random);
	}
}
複製程式碼

搜尋關注公眾號「享智同行」,第一時間獲取技術乾貨

相關文章