1 java數據類型。8種基本類型,3種引用類型 基本類型(也稱:原始類型):byte、short、int、long、char、float、double、boolean 引用類型:類,介面,數組 2 java基本數據類型 Java 基本類型共有八種,基本類型可以分為三類,字元類型char,布爾類型b ...
1 java數據類型。8種基本類型,3種引用類型
基本類型(也稱:原始類型):byte、short、int、long、char、float、double、boolean
引用類型:類,介面,數組
2 java基本數據類型
Java 基本類型共有八種,基本類型可以分為三類,字元類型char,布爾類型boolean以及數值類型byte、short、int、long、 float、double。數值類型又可以分為整數類型byte、short、int、long和浮點數類型float、double。JAVA中的數值 類型不存在無符號的,它們的取值範圍是固定的,不會隨著機器硬體環境或者操作系統的改變而改變。實際上,JAVA中還存在另外一種基本類型void,它也 有對應的包裝類 java.lang.Void,不過我們無法直接對它們進行操作
基本數據類型可以分為四種類型
整型:byte、short、int、long
浮點:float、double
字元:char
真值:boolean
類型 |
byte |
short |
int |
char |
long |
float |
double |
boolean |
void |
大小 |
1位元組 |
2位元組 |
4位元組 |
2位元組 |
8位元組 |
4位元組 |
8位元組 |
1位 |
-- |
封裝器類 |
Byte |
Short |
Integer |
Character |
Long |
Float |
Double |
Boolean |
Void |
取值範圍 |
[-2^7, 2^7 -1] -128~127 |
[-2^15,2^15 - 1] -32768~32767 |
[-2^31,2^31 - 1] |
存儲Unicode碼,用單引號賦值。 |
[-2^63,2^63 - 1] |
數據範圍在3.4e-45~1.4e38 |
數據範圍在4.9e-324~1.8e308 |
只有true和false兩個取值。 |
|
二進位位數 |
8位 |
16位 |
32位 |
16位 |
64位 |
32位 |
64位 |
1位 |
-- |
3 java數據類型之間的轉換
自動轉換:低級到高級轉換。例如byte a;int b = a;
強制轉換:高級到低級轉換(會導致溢出或丟失精度)。例如:int b;short a = (short)b;
註:這裡高、低是指取值範圍。
4 java引用類型
4.1 什麼是引用類型
引用類型(reference type)指向一個對象,不是原始值,指向對象的變數是引用變數。。
4.2 值傳遞和引用傳遞
1)按值傳遞
指的是在方法調用時,傳遞的參數是按值的拷貝傳遞。示例如下:
1. public class TempTest {
2. private
void test1(int a) {
3.
// 做點事情
4.
a++;
5. }
6.
7.
public static void main(String args[]) {
8.
TempTest t = new TempTest();
9.
int a = 3;
10.
t.test1(a);//這裡傳遞的參數a就是按值傳遞。
11.
System.out.printIn("main方法中的a===" + a);
12.
}
13. }
按值傳遞的重要特點:傳遞的是值的拷貝,也就是說傳遞後就互不相關了。第9行的a和第2行的a是兩個變數,當改變第2行的a的值,第9行a的值是不變的,所以列印結果是3。
main 方法中的a 為 3
test1 方法中的a 為 4
我們把第9行的a稱之為實參,第2行的a稱之為形參;對於基本數據類型,形參數據的改變,不影響實參的數據。
2)按引用傳遞
指的是在方法調用時,傳遞的參數是按引用進行傳遞,其實傳遞的是引用的地址,也就是變數所對應的記憶體空間的地址。
示例如下:
1. public class TempTest {
2. private
void test1(A a) {
3.
a.age = 20;
4.
System.out.printIn("test1方法中的age="+a.age);
5. }
6. public static
void main(String args[]) {
7.
TempTest t = new TempTest();
8.
A a = new A();
9.
a.age = 10;
10.
t.test1(a);// 這裡傳遞的參數a就是按引用傳遞
11.
System.out.printIn("main方法中的age="+a.age);
12.
}
13. }
14. classA {
15.
public int age = 0;
16. }
運行結果如下:test1方法中的age = 20
main方法中的age = 20
按引用傳遞的重要特點:
傳遞的是值的引用,也就是說傳遞前和傳遞後都指向同一個引用(也就是同一個記憶體空間)。
要想正確理解按引用傳遞的過程,就必須學會理解記憶體分配的過程,記憶體分配示意圖可以輔助我們去理解這個過程。
用上面的例子來進行分析:
(1)、運行開始,運行第8行,創建了一個A的實例,記憶體分配示意圖如下:
main方法中的a
(2)、運行第9行,修改了A實例裡面的age的值,記憶體分配示意圖如下:
main方法中的a
(3)、運行第10行,是把main方法中的變數a所引用的記憶體空間地址,按引用傳遞給test1方法中的a變數。請註意:這兩個a變數是完全不同的,不要被名稱相同所矇蔽,但它們指向了同一個A實例。記憶體分配示意圖如下:
(4)、運行第3行,為test1方法中的變數a指向A實例的age進行賦值,完成後形成新的記憶體示意圖如下:
此時A實例的age值的變化是由test1方法引起的。
(5)、運行第4行,根據此時的記憶體示意圖,輸出test1方法中的age=20
(6)、運行第11行,根據此時的記憶體示意圖,輸出main方法中的age=20
3)對上述例子的改變
理解了上面的例子,可能有人會問,那麼能不能讓按照引用傳遞的值,相互不影響呢?就是test1方法裡面的修改不影響到main方法裡面的呢?
方法是在test1方法裡面新new一個實例就可以了。改變成下麵的例子,其中第3行為新加的:
1. public class TempTest {
2. private
void test1(A a) {
3.
a = new A();// 新加的一行
4.
a.age = 20;
5.
System.out.printIn("test1方法中的age="+a.age);
6. }
7. public
static void main(String args[]) {
8.
TempTest t = new TempTest();
9.
A a = new A();
10.
a.age = 10;
11.
t.test1(a);// 這裡傳遞的參數a就是按引用傳遞
12.
System.out.printIn("main方法中的age="+a.age);
13.
}
14. }
15. classA {
16.
public int age = 0;
17. }
運行結果為:test1方法中的age=20
main方法中的age=10
實現了按引用傳遞的值傳遞前與傳遞後互不影響,還是使用記憶體示意圖來理解一下:
(1)、運行開始,運行第9行,創建了一個A實例,記憶體分配示意圖如下: