java中参数传递方式话题终结实例

简介: java新手入门面临的一个经典的话题,本文意在终结这个话题,java中有说法:Java里面参数传递都是按值传递,怎么理解这句话?用文字说明恐怕不容易说明白,说明白恐怕也难以想明白。

java新手入门面临的一个经典的话题,本文意在终结这个话题,java中有说法:Java里面参数传递都是按值传递,怎么理解这句话?用文字说明恐怕不容易说明白,说明白恐怕也难以想明白。

前提

先明确一下,按值还是按引用的概念,它是来自c++语言,引用不是汉语词典中的一个词,而是c++的概念——“&”这个符号还记得吧?

为什么有这个话题呢?其一,是对按引用传递理解不透彻;其二,诸多java书籍及讨论论点并没有切中要害。��

一句话概括,按值传参还是按引用传参,既然是参数传递方式,那么只针对形参和实参,这里说的是参数本身,不是参数对象的子对象或孙子对象。

有了前提,上c++代码:

#include <iostream>

using namespace std;

class User
{
    private:
        int m_id;
    public:
        User(int id=0){m_id = id;}
        void setId(int id){m_id = id;}
        int getId(){return m_id;}
};

void test0(User t){//按值传参
  User s;
  t = s;
  t.setId(1002);
  cout << "test1:" << t.getId() << endl;
}

void test1(User *t){//按值传参
  t = new User();//指针指向了一个新对象,外面实参没变
  t->setId(1002);
  cout << "test1:" << t->getId() << endl;
}

void test2(User* & t){//按引用传参
    t = new User();//指针指向了一个新对象,外面实参也跟着变了
    t->setId(1002);
    cout << "test2:" << t->getId() << endl;
}

int main(int argc, char const *argv[]) {
  cout<< "\npass by ref:"<<endl;
  User* t = new User();
  t->setId(1001);
  cout << t->getId() << endl;
  test2(t);
  cout << t->getId() << endl;

  cout<< "\npass by value:"<<endl;
  t = new User();
  t->setId(1001);
  cout << t->getId() << endl;
  test1(t);
  cout << t->getId() << endl;
  return 0;
}

输出结果:

pass by ref:
1001
test2:1002
1002

pass by value:
1001
test1:1002
1001

c++小结:

按值传递,那么在函数内修改了形参指向一个新对象,外面的实参不受影响。

按引用传递,那么在函数内修改了形参指向一个新对象,外面的实参也变了。

旨在说明问题,代码可能有内存泄漏。

上java:

package com.pollyduan.bean;

@Data
public class User {
    private Integer id;

    public static void testObject(User t){
        t=new User();//指向了一个新对象,外面实参没变
        t.setId(1002);
        System.out.println("testObject="+t);
    }

    @Test
    public void testObject(){
        User user=new User();
        user.setId(1001);
        System.out.println("user="+user);
        testObject(user);
        System.out.println("user="+user);
    }
}

输出结果:

user=User(id=1001)
testObject=User(id=1002)
user=User(id=1001)

java小结:

跟c++的逻辑比较一下,请自行对号入座。

万事无绝对,你可能发现jdk中有引用传参的例子,如:

char[] gg={'a','b','c'};
char[] newGG=new char[gg.length];
System.arraycopy(gg,0,newGG,0,gg.length);

看下源码,它不是jdk本身的方法,是JNI,也就是说是jvm的JNI库封装的方法,知道即可。

目录
相关文章
|
Java
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
文章详细解释了Java关键字`super`的用途,包括访问父类的成员变量、调用父类的构造方法和方法,并提供了相应的代码实例。
1955 5
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
|
人工智能 Java 开发者
【Java实例-简易计算机】使用Java实现简单的计算机案例
一个简单的Java案例——“简易计算器”,帮助编程新手快速上手。通过实现用户输入、基本逻辑运算和结果输出,学习者可以掌握变量声明、Scanner对象使用、控制流语句等关键知识点。文章分为设计思路、关键知识点、完整代码和测试运行四个部分。
402 9
【Java实例-简易计算机】使用Java实现简单的计算机案例
|
12月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
420 0
|
安全 Java 测试技术
Java 大学期末实操项目在线图书管理系统开发实例及关键技术解析实操项目
本项目基于Spring Boot 3.0与Java 17,实现在线图书管理系统,涵盖CRUD操作、RESTful API、安全认证及单元测试,助力学生掌握现代Java开发核心技能。
663 0
|
Java 测试技术 项目管理
【JavaEE】从 0 到 1 掌握 Maven 构建 Java 项目核心技巧 解锁 Java 项目高效管理实用实例
本文从Maven基础概念讲起,涵盖安装配置、核心概念(如POM与依赖管理)及优化技巧。结合Java Web项目实例,演示如何用Maven构建和管理项目,解决常见问题,助你高效掌握这一强大工具,提升Java开发与项目管理能力。适合初学者及进阶开发者学习。资源链接:[点此获取](https://pan.quark.cn/s/14fcf913bae6)。
538 6
|
Java 开发者
【Java实例-神秘年龄】用Java挑战你的直觉
我们一起走进这款款简单却充满趣味的Java小游戏——“神秘年龄”。这款游戏不仅适合编程初学者作为练习项目,也能为有一定基础的开发者提供一个轻松的编程小憩。
210 0
【Java实例-神秘年龄】用Java挑战你的直觉
|
Java 开发者
【Java实例-神秘硬币】用Java投掷你的幸运硬币,你是猜正还是反?
本文分享了一个简单有趣的编程案例——猜硬币正反面游戏。通过模拟抛硬币(0为正面,1为反面),用户输入猜测值,程序判断结果并输出。
395 0
【Java实例-神秘硬币】用Java投掷你的幸运硬币,你是猜正还是反?
|
人工智能 Java
Java参数传递分析
本文详细探讨了Java中参数传递的机制,明确指出Java采用的是值传递而非引用传递。通过基本数据类型(如int)和引用类型(如Map、自定义对象People)的实例测试,证明方法内部对参数的修改不会影响原始变量。即使在涉及赋值返回的操作中,表面上看似引用传递,实际仍是值传递的结果。文中结合代码示例与执行结果,深入解析了值传递的本质及容易引起混淆的情形,帮助读者准确理解Java参数传递的核心概念。
304 7
|
前端开发 JavaScript Java
【Java进阶】JavaScript电灯开关实例:从理论到实践
这个例子展示了JavaScript的基本功能,包括操作HTML元素,监听事件,以及改变元素的样式。通过学习和理解这个例子,你可以了解到JavaScript在网页中的应用,以及如何使用JavaScript来创建交互式的网页。
287 13
|
存储 算法 Java
【Java实例-智慧牌局】Java实现赌桌上的21点
游戏规则:游戏开始时,玩家和庄家各获得两张牌,玩家可以看到自己手中的两张牌以及庄家的一张明牌。玩家需要根据手中的牌面总和,选择“要牌”(Hit)以获取更多牌,或“停牌”(Stand)停止要牌。如果玩家的牌面总和超过21点,即为爆牌,玩家立即输掉游戏。若玩家选择停牌,庄家则开始行动,其策略是当牌面总和小于17点时必须继续要牌。若庄家牌面总和超过21点,则庄家爆牌,玩家获胜。若双方均未爆牌,最终比较牌面总和,更接近21点的一方获胜;若牌面总和相同,则游戏以平局结束。
394 0