章節三 Java資料型別劃分
課時七 Java資料型別的劃分(簡介)
1.知識點:
(1)java中各個資料型別的定義;
(2)java各種資料型別的使用;
(3)觀察String型別的使用。
2.具體內容(重點)
任何的程式嚴格來講都屬於一個數據的處理遊戲。所以對於資料的儲存就必須有嚴格的限制,這些限制就體現在資料型別的劃分上,即:不同的資料型別可以儲存不同的資料內容。
(背下來)
基本資料型別不牽扯到記憶體分配問題,而引用資料型別需要開發者為其分配空間,而後進行關係的匹配。
基本資料型別一共分為八種,引用資料型別一共分為三種。那麼這麼多資料型別該如何選擇呢?
個人選擇資料型別原則(他人總結):
- 如果想表示整數就使用int,表示小數就使用double;
- 如果要描述日期時間數字或者表示檔案(或記憶體)大小使用long;
- 如果要實現內容傳遞,或者是編碼轉換使用byte;
- 如果想實現邏輯的控制,可以使用boolean描述;
- 如果想表示中文,使用char。
如果按照儲存範圍:byte < long < double .
課時八 Java資料型別的劃分(整型)
任何一個數字常量(例如10、30、100)都屬於int型別,即:在java中所有設定的整數內容都預設為int型。
範例:定義int變數
public class Testdemo { public static void main(String args[]) { //為變數設定內容使用如下格式: //資料型別 變數名稱 = 常量; int num = 10;//10是常量,預設型別為整型 int result = num*2;//將num中的內容乘以2,再將結果賦值給result System.out.println(result); } }
定義完變數之後,可對變數做四則運算。
變數與常量最大的區別只有一個:常量的值不可變,變數的值是可變的。
public class Testdemo
{
public static void main(String args[])
{
int num = 10;//10是常量,預設型別為整型
int num = num*2;//將num中的內容乘以2,再將結果賦值給變數num
System.out.println(num);
}
}
每一種資料型別都有自己所對應的儲存範圍,
範例:如果超過了int的最大值或最小值的結果
public class Testdemo { public static void main(String args[]) { int max = Integer.MAX_VALUE;//取出整型範圍的最大值:2147483647 int min = Integer.MIN_VALUE;//取出整型範圍的最小值:-2147483648 System.out.println(max); System.out.println(min); //int變數 +/- int變數 = int變數 System.out.println(max+1);//最大值加1:-2147483648(最小值) System.out.println(min-1);//最小值減1:2147483647(最大值) System.out.println(min-2);//最小值減2:2147483646(第二大值) } }
最大值如果繼續增加就變成了最小值,隨後一直像其次的最小值進行迴圈,反之最小值減1就變成了最大值。因為任何的資料計算都是按照二進位制計算的,第一位是符號位,而其他的31位都是資料位。符號位上的1表示正數,0表示負數,當最大值加1時會發生進位,則符號位會由正數變為負數。
這種現象稱為資料的溢位,若想解決這種溢位的問題,就只能通過擴大0資料範圍來實現。比int 範圍更大的是long 型別。
範例:擴大資料型別
public class Testdemo
{
public static void main(String args[])
{
int max = Integer.MAX_VALUE;//取出整型範圍的最大值:2147483647
int min = Integer.MIN_VALUE;//取出整型範圍的最小值:-2147483648
System.out.println(max);
System.out.println(min);
//int變數 +/- long變數 = long變數
System.out.println(max+1L);//最大值加1:2147483648
System.out.println(min-1L);//最小值減1:-2147483649
}
}
在程式的世界裡面,資料型別的轉換有以下規律:
* 資料範圍小的資料與資料範圍大的資料進行數學計算的時候,自動向大範圍的資料型別轉換,然後再進行計算。
* 資料範圍大的資料要變為資料範圍小的資料,那麼必須採用強制轉換;
* 當常量進行強制轉換時,有兩種方法:常量標記(在常量後加上L或l之類的標記)、使用"(資料型別) "。
以上程式碼利用了資料的轉型姐居然了資料的操作錯誤,但是對於程式而言,除了可以將資料範圍小的資料型別變為資料範圍大的資料型別,也可以將資料範圍大的資料型別變為資料範圍小的資料型別。
範例:將資料範圍大的資料型別轉換為資料範圍小的資料型別
public class Testdemo
{
public static void main(String args[])
{
long num = 1000;//1000常量是int型別,使用long型別接受,發生了向範圍大的資料型別轉換
int x = (int)num;//確定num的值在int型別的範圍內,將long新型別強制轉換為int型
System.out.println(x);
}
}
如果將long變為int是所儲存的資料超過 int的範圍,那麼依舊會出現資料溢位的現象。
public class Testdemo
{
public static void main(String args[])
{
long num = 2147483650L;
int x = (int)num;//將long型別轉換為int型
System.out.println(x);
}
}
面試題(越簡單越小心!)
public class Testdemo
{
public static void main(String args[])
{
System.out.println(11 + 1l);
}
}
結果為12,因為在word裡很難看出數字1與字母l的差別,所以遇上簡單的題要格外小心。
在整型資料中,byte型資料是非常有用處的資料型別,首先對於byte型資料他的取值範圍:-128~127之間。
範例:觀察byte的轉換問題
public class Testdemo
{
public static void main(String args[])
{
int num = 130;//此範圍超過了byte定義
byte x = (byte)num;//由int變為byte
System.out.println(x);
}
}
結果:-126 溢位
但是由於byte使用的特殊性,java對其有了一些很好的改善。
範例:觀察byte操作
public class Testdemo
{
public static void main(String args[])
{
byte num = 100;//100是int型常量,這裡將範圍大的資料型別向範圍小的資料型別轉換,應當使用強制型別轉換。
System.out.println(num);
}
}
雖然任何一個證書都屬於int型,但是java 編譯時,如果發現使用的資料變數型別為byte,並且設定的資料型別不在byte資料範圍之內,那麼就會自動的幫助使用者實現資料型別的轉換。反之,如果超過了,則依然會以int型為主。
提示:所有的變數在使用的時候都不要去相信預設值,都自行設定內容。
public class Testdemo
{
public static void main(String args[])
{
int num;//沒有賦值,理論上是預設值0,但不自己賦值編譯時會報錯。
num = 0;//自己給變數賦值
System.out.println(num);
}
}
以上的操作形式屬於先定義一個變數num,但是此變數設定內容,而後設定num的內容,最後再使用此變數,可是以上程式碼在JDK 1.4 及以前的版本是無法編譯通過;因為他們不支援分成兩步寫。最好是在定義變數的同時就給它初始化。
課時九 Java資料型別的劃分(浮點型)
浮點數是小數,java中只要是小數,其型別就是double型(double是儲存範圍最廣的資料型別)
範例:定義小數
public class haha
{
public static void main(String args[])
{
double num = 10.2;//10.2是一個小數,所以他是一個double型。
System.out.println(num*2);//double型 * int型 = double型
}
}
由於預設的小數型別就是double,所以如果使用了float表示,需要將double型變為floa型需要採用強制轉換。
範例 :使用float型
public class haha
{
public static void main(String args[])
{
//轉換方式1:末尾加‘F’
float f1 = 10.2F;//10.2是一個小數,所以他是一個double型。
//轉換方式2:前面加括號以及資料型別
float f2 = (float)10.2;
System.out.println(f1 * f2);//結果為104.03999
}
}
但是發現最終的結果有一點問題,變為了‘104.03999’(後面這個9現在還算少的,以前更多)這個bug自JDK1.0就存在,只能通過後期的處理去解決。
tips:實際上最早開發的時候,考慮到記憶體問題,往往能使用float就不使用double,例如當時的手機開發(J2ME)由於記憶體苛刻,往往會壓縮資料範圍,以節約空間。現在隨著硬體成本的降低,所以使用float型別與double型別的區別就不大了,那麼久直接使用double資料。
需要注意的是,所有的資料型別只有double才可以儲存小數。觀察下面的程式碼:
public class haha
{
public static void main(String args[])
{
int x = 9;
int y = 5;
System.out.println(x/y);//結果為1
}
}
此時如果進行除法計算,發現最終的計算結果為1,因為int不保留小數位。可以做如下改變以精確結果:
public class haha
{
public static void main(String args[])
{
int x = 9;
int y = 5;
System.out.println(x/(double)y);//強制轉換x或者y都可以,只要有其中一個是大範圍資料型別,結果就會由int型變為double型
}
}
在以後的開發之中,一定要考慮到整型不保留小數位的問題。
課時十 Java資料型別的劃分(字元型)
byte是屬於位元組,按照傳統的概念來講,一個字元=2個位元組。對於字元除了與位元組有一些關係之外,最主要的關係在於與int型變數的轉換。
在計算機的世界裡面一切都是編碼的形式出現的,Java使用的是十六進位制的UNICODE編碼,此類編碼可以儲存任意的文字。但是這個編碼在設計的過程之中,考慮到與其他語言的結合問題,在此編碼裡面包含了ASCII碼的部分編碼。
在程式之中使用‘ ’宣告的內容稱為字元,每一個單引號裡面只能儲存一位字元。
public class Testdemo
{
public static void main(String args[])
{
char c = 'A';//字元
//字元與int型相互轉換,以編碼的形式出現
int num = c;
System.out.println(num);
System.out.println(c);
}
}
經測試發現如下編碼情況:
* 'A'(65) ~ 'Z'(90)
* 'a'(97) ~ 'z'(122)
* '0'(48) ~ '9'(57)
其中'A'的編碼值要比'a'小32,所以可以利用簡單的數學計算實現大小寫轉換。
範例:實現大小寫字元轉換過程
public class Testdemo
{
public static void main(String args[])
{
char c = 'A';//大寫字元
//字元與int型相互轉換,以編碼的形式出現
int num = c;//字元A的編碼
num = num+32;//轉換成字元a的編碼
c = (char)num;//小範圍向大範圍轉換需要強制轉換
System.out.println(num);
System.out.println(c);
}
}
傳統的程式語言中,字元裡面只能儲存一些英文字母的標記。但是在java之中,由於使用了UNICODE編碼,這種十六進位制的編碼可以儲存任意的文字,可以設定一箇中文字元。
public class Testdemo
{
public static void main(String args[])
{
char c = '陳';//中文字元
//字元與int型相互轉換,以編碼的形式出現
int num = c;//獲取中文字元的編碼
System.out.println(num);
}
}
課時十一 Java資料型別的劃分(布林型)
布林是一個數學家的名字,布林型是一種邏輯結果,主要儲存兩類資料:true、false,這類資料主要用於一些邏輯使用上。
範例:觀察boolean
public class Testdemo
{
public static void main(String args[])
{
//布林只有兩種值:true、false
boolean flag = true;
if(flag) //if(布林值){滿足條件的操作}
{
System.out.println("Hello world!");
}
}
}
在許多的語言之中,由於設計的初期沒有考慮到布林型的問題,救贖用了數字0表示false,而非0 數字就表示true。
在java中不允許用用數字0或1來填充布林型 的變數內容。
課時十二 Java資料型別的劃分(String型)
String表示的是一個字串,即:多個字元的集合,String要求使用“ ”(雙引號)宣告其內容。
範例:觀察String操作
public class Testdemo
{
public static void main(String args[])
{
String str = "Hello world!";//字串變數
System.out.println(str);
System.out.println("Hello world!");//字串常量
}
}
在String的操作裡面可以使用加號('+')進行字串的連結操作。
範例:字串的連結
public class Testdemo
{
public static void main(String args[])
{
String str = "Hello ";
str+="World! ";//連線方式一
str = str + "haha";//連線方式二
System.out.println(str);
}
}
數學計算裡面有加號('+'),字串裡面也有加號('+'),那麼如果一起使用呢?
public class Testdemo
{
public static void main(String args[])
{
int numA=100;
double numB=99.0;
String str = "加法計算:"+numA+numB;
System.out.println(str);
}
}
結果為加法計算:10099.0
從之前的資料型別來說,任何的資料型別都向範圍大的資料型別進行轉變;如果是int 和double型別進行計算,那麼int要先變為double,而後進行加法計算,但是如果遇見了String,那麼一切就都變了,可以簡單理解為,所有的資料型別如果遇見了 String型別的('+')操作,那麼所有的資料型別都先變為String型別資料,而後執行字串的連結操作。此時,只能通過括號來改變結果。(括號的優先順序最高)
範例:運用括號以後
public class Testdemo
{
public static void main(String args[])
{
int numA=100;
double numB=99.0;
String str = "加法計算:"+(numA+numB);
System.out.println(str);
}
}
結果為加法計算:199.0
在java裡面也支援多種轉移字元的使用,例如:換行(\n)、製表符(\t)、斜線(\\)、雙引號(\")、單引號(\')。
範例:轉義字元
public class Testdemo
{
public static void main(String args[])
{
String str="hello \"haha\" \n你好";
System.out.println(str);
}
}
總結:
1.整數用int,小數用double,邏輯用boolean
2.long、byte、char在處理資料的時候會使用到;
3.資料型別的自動轉換永遠都是小範圍向大範圍轉換,如果大範圍向小範圍轉換要進行強制轉換。
4.int和char之間的互相轉換是以編碼為主的,大寫字母和小寫字母之間只差了32個長度。
5.String是一個特殊的類,用於描述字串,字串使用" "(雙引號)宣告,利用加號("+")實現字串連結