Java數據類型和方法參數
目錄
[tpc]
Java數據類型
Java變量類型可以分為兩種,一種是存儲在堆棧中的基本數據類型,一種是存儲在堆裏的Java對象。
基本數據類型有9種,4種整型,2種浮點型,1種Unicode字符型,1種布爾類型,1種void類型。
void類型用於方法返回值,表示沒有返回值。
基本類型 | 大小(字節) | 包裝器類型 |
---|---|---|
byte | 1 | Byte |
short | 2 | Short |
int | 4 | Integer |
long | 8 | Long |
float | 4 | Float |
double | 8 | Double |
char | 2 | Character |
boolean | -- | Boolean |
void | -- | Void |
引用
引用是一個經常看到的詞,可以理解為一種操縱對象的手段。創建對象的引用並不代表著創建對象。
比如String str
表示創建了一個對象的引用變量,變量str
目前還沒有引用任何對象。
str="hello"
,此時變量str
引用"hello"
字符串對象。
父類的變量可以引用子類的對象。接口的變量可以引用實現類的對象。
方法參數
Java中方法參數的傳遞全部是按值傳遞,也就是說傳遞給方法的參數都是一份新的拷貝。
以下是想要交換兩個數的方法,但結果是錯誤的。因為傳遞給方法的參數是一份新的拷貝,之前的值是沒有變化的。
package com.hnzhrh.fundamental; import java.util.*; public class Test{ public static void main(String[] args){ int a=10; int b=5; swap(a,b); } private static void swap(int a,int b){ int temp=a; a=b; b=temp; } }
方法的執行依賴著操作數棧、局部變量表和程序計數器,並且是方法私有的。對上述程序反編譯:
javap -v -p Test.class
得到帶有附加信息的字節碼,-v
選項表示輸出帶有附加信息,-p
選項表示顯示所有類和成員。
截取main方法部分和swap方法部分內容:
40 public static void main(java.lang.String[]); 41 descriptor: ([Ljava/lang/String;)V 42 flags: ACC_PUBLIC, ACC_STATIC 43 Code: 44 stack=2, locals=3, args_size=1 45 0: bipush 10 46 2: istore_1 47 3: iconst_5 48 4: istore_2 49 5: iload_1 50 6: iload_2 51 7: invokestatic #2 // Method swap:(II)V 52 10: return 53 LineNumberTable: 54 line 7: 0 55 line 8: 3 56 line 9: 5 57 line 10: 10 58 59 private static void swap(int, int); 60 descriptor: (II)V 61 flags: ACC_PRIVATE, ACC_STATIC 62 Code: 63 stack=1, locals=3, args_size=2 64 0: iload_0 65 1: istore_2 66 2: iload_1 67 3: istore_0 68 4: iload_2 69 5: istore_1 70 6: return 71 LineNumberTable: 72 line 12: 0 73 line 13: 2 74 line 14: 4 75 line 15: 6
(44行開始)
初始狀態:
main方法的參數args存儲在局部變量表0號位置中。
bipush 10
10進入操作數棧,istore_1
棧頂元素10出棧並存入局部變量表1號位置。
iconst_5
常數5進入操作數棧,istore_2
棧頂元素5出棧並存入局部變量表2號位置。
iload_1
局部變量表1號位置裏的10入棧。
iload_2
局部變量表2號位置裏的5入棧。
調用方法swap(10,5)
,該方法有自己的操作數棧、局部變量表和程序計數器。
參數10存儲在局部變量表0號位置,參數5存儲在局部變量表1號位置。
iload_0
局部變量表0號位置的10元素入棧。
istore_2
操作數棧棧頂元素10出棧並存儲到局部變量表2號位置。
iload_1
局部變量表1號位置的5入棧。
istore_0
操作數棧棧頂元素5出棧並存入局部變量表0號位置。
iload_2
局部變量表2號位置的10入棧。
istore_1
棧頂元素10出棧並存儲到局部變量表1號位置。
return
方法,方法執行完畢,銷毀棧幀,只是把swqp
方法裏局部變量表裏的參數a跟b互換了,而原本的a和b還原封不動。
需要註意的是,靜態方法局部變量表0號位置的元素是方法第一個參數,而非靜態方法的局部變量表0號元素是this,即對象本身。
技術上使靜態方法不能通過this調用方法。
Java數據類型和方法參數