1. 程式人生 > >Java數據類型和方法參數

Java數據類型和方法參數

swap src 是把 初始 新的 依賴 浮點型 tac center

目錄

[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 1010進入操作數棧,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數據類型和方法參數