[Java]按值传递/按引用传递?

先上一段代码

public class SimpleTest {
    
    String str ="good";
    char[] ch = {'a','b','c'};
    
    public void change(String str,char ch[]){
        str = "test ok";
        ch[0] = 'g';
    }
    
    public static void main(String[] args) {
        SimpleTest st = new SimpleTest();
        st.change(st.str, st.ch);
        System.out.print(st.str + " and ");
        System.out.print(st.ch);
    }
}
PS: 字符串一旦创建,便不可修改
PPS: JVM内存可分为三个区,堆(Heap),栈(Stack),方法区(Method)

堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。


这段代码都做了些什么
1.启动一个JVM进程,首先从classpath找到SimpleTest.class文件,读取文件中的二进制数据,然后把SimpleTest类的类信息存放在运行时数据区的方法区中,这一过程称为SimpleTest的类加载过程
2.JVM定位到方法区中SimpleTest类的main()方法的字节码,开始执行它的指令。第一条语句是:
SimpleTest st = new SimpleTest();
语句很简单啦,就是让JVM创建一个SimpleTest实例,并且,使引用变量st来引用这个实例。看起来是小事一桩,具体JVM是怎么执行的呢?
1> 不就是建立一个SimpleTest实力吗?JVM直奔方法区,先找到SimpleTest类的类信息再说。结果呢//木有@_@,这会儿的方法区内还没有SimpleTest类。可JVM也不蠢...“自己动手,丰衣足食”,立马加载了SimpleTest类,并把类信息存放在方法区里。
2>类信息有了,JVM第一件事就是在堆内为一个新的SimpleTest实例分配内存,这个SimpleTest实例持有着指向方法区中的内存地址,这个地址,就存放在了SimpleTest实力的数据区。
3>在JVM进程中,每个进程都会拥有一个方法调用栈,用来跟踪线程运行中一系列的方法调用过程,栈中的每一个元素就被称为栈帧,每当线程调用一个方法的时候就会向方法栈压入一个新帧,用来存储方法的参数,局部变量和运算过程中的临时数据。位于“=”前的st是一个在main()方法中定义的变量,可见他是一个局部变量,因此它会被添加到执行了main()方法的主线程的JAVA方法调用栈中。而“=”将把这个st变量指向堆区中的SimpleTest实例,也就是说,它持有指向SimpleTest实例的引用。
到这里,第一条语句就执行完了。
3.接着就是调用st引用的对象的change方法,并把st所引用的字符串str和字符数组ch传入change方法,以一个新帧被压入change()方法所在的主线程的栈区。
4.在change()方法所在的栈区,st.str被要求引用"test ok"所在内存的地址,注意到上面提及的,“字符串一旦创建,便不可修改”,便是在main()方法所在的栈区内,st.str始终是引用了"good"所在的地址,在change()方法所在的栈区内,想改变st.str的引用为"test ok",实际上是重新开辟了另一块内存存放"test ok",并将此时的st.str暂时指向"test ok",我们可以在两处str和ch分别输出他们的hashcode。
引用变量时,除了8个基本类型外(byte,short,int,long,float,double,char,boolean),都是传递的内存地址,包括数组。所以这里的char数组ch[],是st.ch所开辟出来的内存地址,被要求ch[0]重新指向字符'g'。
到此,change()方法结束。
5.回到main()方法,st.str仍然指向"good",但ch[0]指向了'g'。
输出 good and gbc

Java没有按引用传递,全部是按值传递,传的是内存地址

jvm.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容