文章目錄
- 資料類型
-
- 1.整型變量
-
- 什麼是位元組?
- 2.長整型變量
- 3.雙精度浮點型變量
- 4.單精度浮點型變量
- 5. 字元類型變量
- 6.位元組類型變量
- 7.短整型變量
- 8.布爾類型變量
- 引用類型
-
- 字元串類型變量(重點)
- 變量
-
- 變量的作用域
- 變量的命名規則
- 常量
-
- 1.字面值常量
- 2. final 關鍵字修飾的常量
- 了解類型轉換
- 了解數值提升
資料類型
- 變量指的是程式運作時可變的量. 相當于開辟一塊記憶體空間來儲存一些資料.
- 類型則是對變量的種類進行了劃分, 不同的類型的變量具有不同的特性.
- 我們所讨論的 “變量” 主要和我們的 “記憶體” 這樣的硬體裝置密切相關.
java的八種資料類型和一種引用類型及變量【詳解篇2】資料類型引用類型變量
馮諾依曼:現代計算機之父(大佬中的大佬)
詳情點選:馮諾依曼結構計算機
輸入裝置:如:鍵盤、話筒
輸出裝置:如:顯示屏、音響
CPU:由運算器和控制器組成
外存儲器:如:優盤、硬碟、CD光牒(碟)
記憶體儲器:程式(你打開的所有軟體的運作程式)都在記憶體儲器上跑,
為什麼要講這塊兒呢?
是為了明白我們定義的變量要占記憶體,而占的記憶體就是記憶體儲器上的記憶體,也就是說程式跑到哪裡就會占用哪裡的記憶體。
1.整型變量
基本文法格式
int 變量名 = 初始值;
代碼示例:
int a = 10; // 定義一個整型變量
System.out.println(a) ;
思考3個問題:
①a占用幾個位元組?
②a的取值範圍是多少?
③有沒有無符号整型?
答:①:a占用4個位元組,在java中int就占4個位元組,和多少位平台沒有關系(32位/64位都占4個位元組),是以可以說它的可移植性強
②: -2 31~
231-1(-2147483648~2147483647)
③:在java當中沒有無符号這樣的概念,都是有符号的,如沒有無符号的整數,“統統”都是有符号的。
注意事項:
- int 表示變量的類型是一個整型
- 變量名是變量的辨別,也叫辨別符. 後續都是通過這個名字來使用變量
- 建議建立變量的時候都要初始化.
- 在 Java 中, 一個 int 變量隻占 4 個位元組. 和作業系統沒有直接關系.
- 在java當中,辨別符由數字,字母,下劃線,$ 這四種組成,但辨別符能以數字開頭,當然,也盡量不要以下劃線、$開頭和結尾,雖然合法但不太合理。
什麼是位元組?
位元組是計算機中表示空間大小的基本機關.
計算機使用二進制表示資料. 我們認為 8 個二進制位(bit) 為一個位元組(Byte).
我們平時的計算機為 8GB 記憶體, 意思是 8G 個位元組.
其中 1KB = 1024 Byte, 1MB = 1024 KB, 1GB = 1024 MB.
是以 8GB 相當于 80 多億個位元組.
4 個位元組表示的資料範圍是 -2^31 -> 2^31-1 , 也就大概是 -21億 到 +21億
通過代碼檢視 Java 中的整型資料範圍:
代碼1:
public class testDemo1 {
public static void main1(String[] args) {
int a=10;//定義一個整型變量并初始化
System.out.println(a);
//列印int的最大最小值:
System.out.println(Integer.MAX_VALUE);//Integer是int的包裝類
System.out.println(Integer.MIN_VALUE);
}
}
列印結果:
通過畫圖檢視 Java 中的整型資料範圍:在計算機的世界中,假設将整型的取值範圍看成是一個圓
代碼2:但如果運算的結果超出了 int 的最大範圍, 就會出現溢出的情況
public static void main(String[] args) {
int maxValue=Integer.MAX_VALUE;
System.out.println(maxValue+1);//最大值+1
int minValue=Integer.MIN_VALUE;
System.out.println(minValue-1);//最小值-1
}
運作結果:
21億這樣的數字對于目前的大資料時代來說, 是很容易超出的. 針對這種情況, 我們就需要使用更大範圍的資料類型來表示了,java中提供了long類型。
2.長整型變量
文法格式
long 變量名=初始值;
代碼示例:
public static void main(String[] args) {
long l=10L;//定義一個長整型變量并初始化
System.out.println(l);
// 檢視 Java 中的長整型資料範圍:
System.out.println(Long.MAX_VALUE);//注意是Long,而不是long,Long是long的包裝類
System.out.println(Long.MIN_VALUE);
}
列印結果:
從列印結果來看,這個資料範圍遠超過 int 的表示範圍. 足夠絕大部分的工程場景使用。
注意事項:
- 基本文法格式和建立 int 變量基本一緻, 隻是把類型修改成 long
- 初始化設定的值為 10L , 表示一個長整型的數字. 10l 也可以.
- 使用 10 初始化也可以, 10 的類型是 int, 10L 的類型是 long, 使用 10 L 或者 10 l 更好一些.
- 4.Java 中 long 類型占 8 個位元組. 表示的資料範圍 -2^63 ~2^63-1。
3.雙精度浮點型變量
文法格式
double 變量名=初始值;
代碼示例:
public static void main(String[] args) {
double d1=1.11;//定義一個double類型的變量并初始化
System.out.println(d1);
// 檢視 Java 中的double資料範圍:
System.out.println(Double.MAX_VALUE);//Double是double的包裝類
System.out.println(Double.MIN_VALUE);
double d2=1.1;
System.out.println(d2*d2);
}
列印結果:
Java 中的 double 雖然也是 8 個位元組, 但是浮點數的記憶體布局和整數差别很大, 不能單純的用 2 ^ n 的形式表示資料範圍。
注意:以後寫代碼表示小數的時候,盡量用double,可以更加精确,因為小數是沒有精确的值的,如上面代碼中d2的列印結果。
4.單精度浮點型變量
基本格式:
float 變量名 = 初始值;
代碼示例:
public static void main(String[] args) {
float f1=11.1f;//11.1後面需要加f或F,因為java是強類型語言,一旦等号兩邊的類型不比對就會報錯soutsout
System.out.println(f1);
// 檢視 Java 中的float資料範圍:
System.out.println(Float.MAX_VALUE);//Float是Float的包裝類
System.out.println(Float.MIN_VALUE);
}
運作結果:
flfloat 類型在 Java 中占四個位元組, 同樣遵守 IEEE 754 标準. 由于表示的資料精度範圍較小, 一般在工程上用到浮點數都優先考慮double,不推薦float。
5. 字元類型變量
基本格式:
char 變量名 = 初始值;
代碼示例:
public static void main(String[] args) {
char ch1='a';
System.out.println(ch1);
char ch2=97;
System.out.println(ch2);
char ch3='嗨';//char在java中是兩個位元組,可以引一個漢字
System.out.println(ch3);
// 檢視 Java 中的char的取值範圍:
System.out.println(Character.MAX_VALUE);//Character是char的包裝類
System.out.println(Character.MIN_VALUE);
}
列印結果:
注意:char類型的取值是從0開始的不能存負數,它的取值範圍是0~65535(2個位元組,16位)。
如:
關于字元編碼方式的讨論, 參見https://zhuanlan.zhihu.com/p/35172335
6.位元組類型變量
基本文法格式:
byte 變量名 = 初始值;
代碼示例:
public static void main(String[] args) {
byte a=10;
byte b=20;
System.out.println(a);
System.out.println(b);
// 檢視 Java 中的byte的取值範圍:
System.out.println(Byte.MAX_VALUE);//Byte是byte的包裝類
System.out.println(Byte.MIN_VALUE);
}
列印結果:
注意:
1.java當中的byte其實很類似于C語言中的char,它有一個位元組,取值範圍-128~127。
2.局部變量在使用的時候必須初始化,否則編譯不能通過;
3.給任何的資料類型指派的時候字面值是一定不能超過這種類型的取值範圍的。
如:
7.短整型變量
基本文法格式:
short 變量名 = 初始值;
代碼示例:
public static void main(String[] args) {
short s=1;
System.out.println(s);
// 檢視 Java 中的short的取值範圍:
System.out.println(Short.MAX_VALUE);//Short是short的包裝類
System.out.println(Short.MIN_VALUE);
}
列印結果:
注意:
- short 占用 2 個位元組, 表示的資料範圍是 -32768 -> +32767
- 這個表示範圍比較小, 一般不推薦使用.
8.布爾類型變量
基本文法格式:
boolean 變量名 = 初始值;
代碼示例:
public static void main(String[] args) {
boolean flg1=true;
System.out.println(flg1);
boolean flg2=false;
System.out.println(flg2);
}
列印結果:
注意事項:
1.boolean 類型的變量隻有兩種取值, true 表示真, false 表示假.
2. 在java當中,不存在 1 表示 true, 0 表示 false 這樣的用法.
3. boolean 類型JVM 的實作有些 書上寫是占 1 個位元組, 有些占1個比特位,這個沒有明确規定。
總結:Java中的八種資料類型
簡單類型/内置類型 | 包裝類 | 大小(機關位元組) | 取值範圍 |
---|---|---|---|
int | Integer | 4 | -231~231-1 |
long | Long | 8 | -263~263-1 |
double | Double | 8 | 參考C語言浮點數的存儲 |
float | Float | 4 | 參考C語言浮點數的存儲 |
char | Character | 2 | 0~65535 |
byte | Byte | 1 | -128~127 |
shotr | Short | 2 | -215~215-1 |
boolean | Boolean | JVM标準并未說明 | true/false |
引用類型
字元串類型變量(重點)
基本文法格式:
String 變量名 = “初始值”;
代碼示例:
public static void main(String[] args) {
String str="wasia wasai";//String是引用資料類型,Str 是一個引用變量
System.out.println(str);
//1.字元串和任意類型的資料使用加号拼接後其結果也是字元串
//java中的字元串拼接格式
int a=10;
System.out.println("a="+a);
int b=30;
System.out.println("hello "+a+b);
//2.如果字元串放在後面就會先執行+操作再做字元串連接配接
System.out.println(a+b+"hehe");
//3.字元串中的一些特定的不太友善直接表示的字元需要進行轉義
String c="hello \"哇塞哇塞\"";// 建立一個字元串 hello ”哇塞哇塞“
System.out.println(c);
}
列印結果:
字元串的 + 操作, 表示字元串拼接:
public static void main(String[] args) {
String str1="luanshizhongde";
String str2="meishen";
String str3=str1+str2;
System.out.println(str3);
}
字元串和整數進行拼接:
public static void main(String[] args) {
String str="result=";
int a=999;
int b=1;
String value=str+a+b;
System.out.println(value);
}
列印結果:
以上代碼說明, 當一個 + 表達式中存在字元串的時候, 都是執行字元串拼接行為.
是以我們可以很友善的使用 System.out.println 同時列印多個字元串或數字
如:
public static void main(String[] args) {
int a=520;
int b=1314;
System.out.println("a="+a+",b="+b);
}
注意:轉義字元有很多, 其中幾個比較常見的如下:
轉義字元 | 解釋 |
---|---|
\n | 換行 |
\t | 水準制表符 |
\ ’ | 單引号 |
\ " | 雙引号 |
\ \ | 反斜杠 |
變量
變量的作用域
也就是該變量能生效的範圍, 一般是變量定義所在的代碼塊 (大括号)
【局部變量作用域】代碼示例:
【變量重定義】代碼示例:
如何解決重定義?
運作結果:int i=999;表示對i初始化,i=9;表示将i改為了9
注意:
1.什麼是局部變量?
答:定義在函數體内的變量,
2.局部變量的作用域在它所在的這個函數的函數體内
3.如何判斷局部變量是否在函數體内?
答:找花括号,即博涵這個變量的花括号的開始和結束位置。
4.局部變量在使用的是必須初始化。
變量的命名規則
硬性名額:
- 一個變量名隻能包含數字, 字母, 下劃線
- 數字不能開頭.
- 變量名是大小寫敏感的. 即 num 和 Num 是兩個不同的變量.
軟性名額:
1.變量命名要具有描述性, 見名知意.
2.變量名不宜使用拼音(但是不絕對).
3.變量名的詞性推薦使用名詞.
4.雖然文法上也允許使用中文/美元符($)命名變量, 但是 強烈 不推薦這樣做
5.變量的命名,建議采用小駝峰命名法。
疑問:
什麼是大駝峰?
當一個變量名由多個單詞構成的時候, 除了第一個單詞之外, 每個單詞的首字母都大寫
什麼是小駝峰?
當一個變量名由多個單詞構成的時候, 除了第一個單詞之外, 其他單詞的首字母都大寫
代碼示例:
public static void main(String[] args) {
//小駝峰命名示例
int maxNum=11;
String studengAge="20";
System.out.println(maxNum);
System.out.println(studengAge);
//大駝峰命名示例
int MaxNum=12;
System.out.println(MaxNum);
}
列印結果:
什麼時候使用小駝峰,什麼時候使用大駝峰?
小駝峰 | 大駝峰 |
---|---|
變量的命名 | 類名 |
方法的名稱 | 接口 |
抽象類 |
常量
上面讨論的都是各種規則的變量, 每種類型的變量也對應着一種相同類型的常量.
常量指的是運作時類型不能發生改變.
常量主要有以下兩種展現形式:
1.字面值常量
10 // int 字面值常量(十進制)
010 // int 字面值常量(八進制) 由數字 0 開頭. 010 也就是十進制的 8
0x10 // int 字面值常量(十六進制) 由數字 0x 開頭. 0x10 也就是十進制的 16
10L // long 字面值常量. 也可以寫作 10l (小寫的L)
1.0 // double 字面值常量. 也可以寫作 1.0d 或者 1.0D
1.5e2 // double 字面值常量. 科學計數法表示. 相當于 1.5 * 10^2
1.0f // float 字面值常量, 也可以寫作 1.0F
true // boolen 字面值常量, 同樣的還有 false
'a' // char 字面值常量, 單引号中隻能有一個字元
"abc" // String 字面值常量, 雙引号中可以有多個字元.
2. final 關鍵字修飾的常量
C語言中修飾常量的關鍵字為const,而Java中修飾常量的關鍵字為final.
代碼示例:
建議:由final修飾的變量建議大寫,易于區分。
如:
public static void main(String[] args) {
final int NUM;
NUM=20;
System.out.println(NUM);
}
提示:final 不僅可以修飾變量,還可以修飾函數,修飾類,修飾函數把它叫做密封方法,修飾類把它叫做密封類。
了解類型轉換
Java 作為一個強類型程式設計語言, 當不同類型之間的變量互相指派的時候, 會有教嚴格的校驗。
代碼示例:int 和 long/double/float 互相指派
結論: 不同數字類型的變量之間指派, 表示範圍更小的類型能隐式轉換成範圍較大的類型, 反之則不行。
如何解決呢?需要強制類型轉換。
代碼示例:int 和 boolean 互相指派
結論:int 和 boolean 是毫不相幹的兩種類型, 不能互相指派,也不能強制類型轉換.
類型的轉換要注意:
- 注意等号兩邊的資料類型的位元組大小,以及表示的數字的寬度(如float可以表示整數也可表示小數,而int隻能表示整數)。
- boolean類型不能和任何其他的資料類型之間進行轉換。
- .強制類型轉換可能會導緻精度丢失,小數點後面的部分會被忽略。
- .強制類型轉換不是一定能成功, 互不相幹的類型之間無法強轉.
代碼示例:int字面值常量 給 byte 指派
注意: byte 表示的資料範圍是 -128 -> +127, 256 已經超過範圍, 而 100 還在範圍之内
結論: 使用字面值常量指派的時候, Java 會自動進行一些檢查校驗, 判定指派是否合理.
類型轉換總結
- 不同數字類型的變量之間指派, 表示範圍更小的類型能隐式轉換成範圍較大的類型.
- 如果需要把範圍大的類型指派給範圍小的, 需要強制類型轉換, 但是可能精度丢失.
- 将一個字面值常量進行指派的時候, Java 會自動針對數字範圍進行檢查.
了解數值提升
疑問:為什麼e變量可以編譯通過呢?
答:因為a,b是變量,變量隻有程式運作的時候才能知道a,b裡面放的是幾;而e=10+20java在編譯的時候就已經算出為30了,相當于是一個常量,即byte e=10+20;相當于byte e=30;
結論:
-
byte 和 byte 都是相同類型, 但是出現編譯報錯. 原因是, 雖然 a 和 b 都是 byte, 但是計算 a + b 會先将 a 和 b 都
提升成 int, 再進行計算, 得到的結果也是 int, 這是賦給 c, 就會出現上述錯誤.
- 由于計算機的 CPU 通常是按照 4 個位元組為機關從記憶體中讀寫資料. 為了硬體上實作友善, 諸如 byte 和 short 這種低于4 個位元組的類型, 會先提升成 int, 再參與計算.
int 和 long 混合運算
結論:當 int 和 long 混合運算的時候, int 會提升成 long, 得到的結果仍然是 long 類型, 需要使用 long 類型的變量來
接收結果. 如果非要用 int 來接收結果, 就需要使用強制類型轉換.
類型提升小結:
- 不同類型的資料混合運算, 範圍小的會提升成範圍大的.
- 對于 short, byte 這種比 4 個位元組小的類型, 會先提升成 4 個位元組的 int , 再運算.
int 和 String 之間的互相轉換
代碼示例:
public static void main(String[] args) {
int a=55;
String str1=a+"";
System.out.println(str1);//55 , 但這裡的55是一個字元串
String str2=String.valueOf(a);//String.valueOf(a)的作用是把a變成一個字元串
System.out.println(str2);//55, 這裡的55是一個字元串
String str="999";
int num = Integer.parseInt(str);//Integer.parseInt(str)的作用是把字元串str變成一個整數,也可使用 Integer.valueOf
System.out.println(num);//999, 但這裡的999是一個整數
}
了解valueOf的使用可查詢