Java 参数传递

Java方法传参方式记住了两点。基本上不会犯错误。

  1. 方法内修改基础数据类型(数字类型或布尔类型)不会改变方法外的参数;
  2. 方法内修改对象(包含数组)状态会同步修改方法方法外的参数。

程序片段1来验证第一点:
public static void main(String[] args) {
    Integer a = 5;
    System.out.println("入栈前 a = " + a);
    calc(a);
    System.out.println("出栈后 a = " + a);    
 }
private static void calc(Integer a) {
    a = a * 3;
    System.out.println("栈内计算 a = " + a);
}
程序的运行结果为:
入栈前 a = 5
栈内计算 a = 15
出栈后 a = 5

程序片段2来验证第二点
public static void main(String[] args) {
    Stu tom = new Stu(30, "tom");
    System.out.println("入栈前 tom = " + tom);
    doubleScore(tom);
    System.out.println("出栈后 tom = " + tom);

}

private static void doubleScore(Stu tom) {
    tom.score = tom.score * 2;
    System.out.println("栈内计算 tom = " + tom);
}

private static class Stu {
    String name;
    int score;
    public Stu(int score, String name) {
        this.score = score;
        this.name = name;
    }
    @Override
    public String toString() {
        return "[ name='" + name + '\'' + ", score=" + score + ']';
    }
}
片段2的运行结果为:
入栈前 tom = [ name='tom', score=30]
栈内计算 tom = [ name='tom', score=60]
出栈后 tom = [ name='tom', score=60]

从两段程序的结果看,片段1的基础数据参数用值传递来解释的通;片段2的对象参数用引用传递也行的通。

究竟参数传递采用哪种方式呢,特地翻了 Java编程思想第四版 第12章 传递和返回对象 中给出了解释,Java中所有参数或自变量都是通过句柄的方式传递的,向方法中传递一个参数时,实际上传递的只是指向外部对象的一个句柄。

看清楚了吗,人家根本不关心什么值传递、引用传递,实际上问题的关键是怎么理解 句柄

  • Java按值传递任何东西。句柄当做指针,传递对象就是拷贝对象的地址值,参数也指向该对象,方法内对象状态改外部对象也会改变;基础数据类型就更明显,基础数据传入方法会得到一个数据的副本,所以一切传参都是按值传递。
  • Java主要按值传递,但对象却是引用传递。句柄看做对象的一个“别名”,由于对象传入方法没有获得一个本地副本,所以对象传递显然不是值传递,而是引用传递。
    句柄 的理解不同带来了不同的结果,原书的作者直接回避了这个问题,也许java的设计者压根没有考虑这个问题,才会后面的争议。

还有一点一定要记住,记为第三点:
  1. 方法不能改变对象参数的引用
程序片段3来验证第3点:
public static void main(String[] args) {
    Stu tom = new Stu(30, "tom");
    System.out.println("入栈前 tom = " + tom);
    convert(tom);
    System.out.println("出栈后 tom = " + tom);
}
private static void convert(Stu tom) {
    tom = new Stu(50, "jack");
    System.out.println("栈内计算 tom = " + tom);
}
程序片段3来运行结果:
入栈前 tom = [ name='tom', score=30]
栈内计算 tom = [ name='jack', score=50]
出栈后 tom = [ name='tom', score=30]

总结

不管一切按值传递,还是主要按值传递,从这三个特点来讲都解释的通,没必要为概念纠结,明白特性才是关键!

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

推荐阅读更多精彩内容