首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java 之步骤调用 方法传参 值传递还是引用传递字节码

2012-12-21 
java 之方法调用 方法传参 值传递还是引用传递字节码?package com.zhangpublic class Test{public static

java 之方法调用 方法传参 值传递还是引用传递字节码

?package com.zhang;public class Test{    public static void changeStr(String str){        str="welcome";    }    public static void main(String[] args) {        String str="1234";        changeStr(str);        System.out.println(str);    }}/* * Compiled from "Test.java"public class Test extends java.lang.Object  SourceFile: "Test.java"  minor version: 0  major version: 50  Constant pool:const #1 = Method       #8.#19; //  java/lang/Object."<init>":()Vconst #2 = String       #20;    //  welcomeconst #3 = String       #21;    //  1234const #4 = Method       #7.#22; //  Test.changeStr:(Ljava/lang/String;)Vconst #5 = Field        #23.#24;        //  java/lang/System.out:Ljava/io/PrintStream;const #6 = Method       #25.#26;        //  java/io/PrintStream.println:(Ljava/lang/String;)Vconst #7 = class        #27;    //  Testconst #8 = class        #28;    //  java/lang/Objectconst #9 = Asciz        <init>;const #10 = Asciz       ()V;const #11 = Asciz       Code;const #12 = Asciz       LineNumberTable;const #13 = Asciz       changeStr;const #14 = Asciz       (Ljava/lang/String;)V;const #15 = Asciz       main;const #16 = Asciz       ([Ljava/lang/String;)V;const #17 = Asciz       SourceFile;const #18 = Asciz       Test.java;const #19 = NameAndType #9:#10;//  "<init>":()Vconst #20 = Asciz       welcome;const #21 = Asciz       1234;const #22 = NameAndType #13:#14;//  changeStr:(Ljava/lang/String;)Vconst #23 = class       #29;    //  java/lang/Systemconst #24 = NameAndType #30:#31;//  out:Ljava/io/PrintStream;const #25 = class       #32;    //  java/io/PrintStreamconst #26 = NameAndType #33:#14;//  println:(Ljava/lang/String;)Vconst #27 = Asciz       Test;const #28 = Asciz       java/lang/Object;const #29 = Asciz       java/lang/System;const #30 = Asciz       out;const #31 = Asciz       Ljava/io/PrintStream;;const #32 = Asciz       java/io/PrintStream;const #33 = Asciz       println;{public Test();  Code:   Stack=1, Locals=1, Args_size=1   0:   aload_0   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V   4:   return  LineNumberTable:   line 1: 0public static void changeStr(java.lang.String);  Code:   Stack=1, Locals=1, Args_size=1   0:   ldc     #2; //String welcome 将string welcome常量从常量池取出,推入栈顶   2:   astore_0 //将栈顶引用类型数值存到第一个本地变量(局部变量表)   3:   return  LineNumberTable:   line 3: 0   line 4: 3public static void main(java.lang.String[]);  Code:   Stack=2, Locals=2, Args_size=1   0:   ldc     #3; //String 1234 将string 1234常量从常量池取出,推入栈顶   2:   astore_1  //将栈顶引用类型数值存到第二个本地变量(局部变量表)   3:   aload_1   //将第二个引用类型本地变量推送至栈顶   4:   invokestatic    #4; //Method changeStr:(Ljava/lang/String;)V   7:   getstatic       #5; //Field java/lang/System.out:Ljava/io/PrintStream;   10:  aload_1   //将第二个引用类型本地变量推送至栈顶   11:  invokevirtual   #6; //Method java/io/PrintStream.println:(Ljava/lang/String;)V   14:  return  LineNumberTable:   line 6: 0   line 7: 3   line 8: 7   line 9: 14} * */ 

?

package com.zhang;public class Test4{   public static void changeStr(T str){        str.name = "sf";    }    public static void main(String[] args) {       T t = new T();    changeStr(t);        System.out.println(t.name);    }}class T{String name = "name--min";@Overridepublic String toString() {// TODO Auto-generated method stubreturn name;}}/* *Compiled from "Test4.java"public class Test4 extends java.lang.Object  SourceFile: "Test4.java"  minor version: 0  major version: 50  Constant pool:const #1 = Method       #10.#21;        //  java/lang/Object."<init>":()Vconst #2 = String       #22;    //  sfconst #3 = Field        #4.#23; //  T.name:Ljava/lang/String;const #4 = class        #24;    //  Tconst #5 = Method       #4.#21; //  T."<init>":()Vconst #6 = Method       #9.#25; //  Test4.changeStr:(LT;)Vconst #7 = Field        #26.#27;        //  java/lang/System.out:Ljava/io/Printtream;const #8 = Method       #28.#29;        //  java/io/PrintStream.println:(Ljava/ang/String;)Vconst #9 = class        #30;    //  Test4const #10 = class       #31;    //  java/lang/Objectconst #11 = Asciz       <init>;const #12 = Asciz       ()V;const #13 = Asciz       Code;const #14 = Asciz       LineNumberTable;const #15 = Asciz       changeStr;const #16 = Asciz       (LT;)V;const #17 = Asciz       main;const #18 = Asciz       ([Ljava/lang/String;)V;const #19 = Asciz       SourceFile;const #20 = Asciz       Test4.java;const #21 = NameAndType #11:#12;//  "<init>":()Vconst #22 = Asciz       sf;const #23 = NameAndType #32:#33;//  name:Ljava/lang/String;const #24 = Asciz       T;const #25 = NameAndType #15:#16;//  changeStr:(LT;)Vconst #26 = class       #34;    //  java/lang/Systemconst #27 = NameAndType #35:#36;//  out:Ljava/io/PrintStream;const #28 = class       #37;    //  java/io/PrintStreamconst #29 = NameAndType #38:#39;//  println:(Ljava/lang/String;)Vconst #30 = Asciz       Test4;const #31 = Asciz       java/lang/Object;const #32 = Asciz       name;const #33 = Asciz       Ljava/lang/String;;const #34 = Asciz       java/lang/System;const #35 = Asciz       out;const #36 = Asciz       Ljava/io/PrintStream;;const #37 = Asciz       java/io/PrintStream;const #38 = Asciz       println;const #39 = Asciz       (Ljava/lang/String;)V;{public Test4();  Code:   Stack=1, Locals=1, Args_size=1   0:   aload_0   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V   4:   return  LineNumberTable:   line 1: 0public static void changeStr(T);  Code:   Stack=2, Locals=1, Args_size=1   0:   aload_0  ////将栈顶引用类型数值存到第一个本地变量(局部变量表)   1:   ldc     #2; //String sf 将string sf常量从常量池取出,推入栈顶   3:   putfield        #3; //Field T.name:Ljava/lang/String;//为t对象的name字段赋值   6:   return  LineNumberTable:   line 3: 0   line 4: 6public static void main(java.lang.String[]);  Code:   Stack=2, Locals=2, Args_size=1   0:   new     #4; //class T  创建一个新对象,并压入栈顶   3:   dup      //复制栈顶数值,并将复制值压入栈顶   4:   invokespecial   #5; //Method T."<init>":()V 调入无参够造方法   7:   astore_1  //将栈顶引用类型数值存到第二个本地变量(局部变量表)   8:   aload_1   //将第二个引用类型本地变量推送至栈顶   9:   invokestatic    #6; //Method changeStr:(LT;)V   12:  getstatic       #7; //Field java/lang/System.out:Ljava/io/PrintStream;   15:  aload_1     //将第二个引用类型本地变量推送至栈顶   16:  getfield        #3; //Field T.name:Ljava/lang/String; //获取对象的相应字段name。并压入栈顶   19:  invokevirtual   #8; //Method java/io/PrintStream.println:(Ljava/lang/Sting;)V   22:  return  LineNumberTable:   line 7: 0   line 8: 8   line 9: 12   line 10: 22} * */ 

?

热点排行