1 案例引入:实验源码

【案例结论】

调用方client想通过修改方法updateMethod(oldObject)调用方所在的引用对象(非基本数据类型)oldObject的属性值进行修改,则:

  • 修改方法 需保证:方法返回的引用对象调用方传入的原引用对象的引用地址(句柄)必须一致。

object = new ClassName(); //此操作其实是对变量 object 赋予/分配新的对象地址

关键方法: updateUser*()

import org.junit.Test;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set; public class MainTest {
@Test
public void testModifyInStreamForEachOfList1() {
ArrayList<User> list = new ArrayList<User>();
User user = new User();
user.name = "wahahahhaha";
list.add(user);
list.stream().forEach(item -> {
item.name = "efisgbdfjsb";// 为已设置值的字段 更新 值
item.age = 4; // 为未设置值的字段 设置 新值
});
list.stream().forEach(item -> {
System.out.println(item);
});
//output: name:efisgbdfjsb/tage:4
} @Test
public void testModifyInStreamForEachOfList2() {
ArrayList<User> list = new ArrayList<User>();
User user = new User();
user.name = "wahahahhaha";
list.add(user);
list.stream().forEach(item -> {
item = updateUserByOldObject(item);
});
list.stream().forEach(item -> {
System.out.println(item);
});
//output: name:efisgbdfjsb/tage:4
} @Test
public void testModifyInStreamForEachOfList3() {
ArrayList<User> list = new ArrayList<User>();
User user = new User();
user.name = "wahahahhaha";
list.add(user);
list.stream().forEach(item -> {
updateUserByOldObject(item);
});
list.stream().forEach(item -> {
System.out.println(item);
});
//output: name:efisgbdfjsb/tage:4
} @Test
public void testModifyInStreamForEachOfList4() {
ArrayList<User> list = new ArrayList<User>();
User user = new User();
user.name = "wahahahhaha";
list.add(user);
list.stream().forEach(item -> {
item = updateUserByNewObject(user);
});
list.stream().forEach(item -> {
System.out.println(item);
});
//output: name:wahahahhaha/tage:0
} public User updateUserByOldObject(User user) {//在 旧对象上做修改,然后返回
user.name = "efisgbdfjsb";// 为已设置值的字段 更新 值
user.age = 4; // 为未设置值的字段 设置 新值
return user;
} public User updateUserByNewObject(User user) {//在 new 的新对象上做修改,然后返回
User newUser = new User();
newUser.name = "efisgbdfjsb";// 为已设置值的字段 更新 值
newUser.age = 4; // 为未设置值的字段 设置 新值
return newUser;
}
} class User{
public String name;
public int age; @Override
public String toString(){
return "name:"+name+"/t"+"age:"+age;
}
}

2 方法的参数传递机制

2-1 实参和形参

  • 实参(实际参数)

    一般地,把调用方法语句中的参数,称为实参(实际参数)。

    实参可以是常量、变量、对象或表达式。

  • 形参(形式参数)

    一般地,把方法声明中的参数,称为形参(形式参数)。

  • 补充

    • 方法调用执行的过程,其实就是将实参的数据传递给方法的形参,以这些数据为基础,执行方法完成所要表达的功能。
    • 在实参和形参的结合上,必须保持“三一致”:

实参与形参对应的个数一致

实参与形参对应的数据类型一致

实参与形参对应的顺序一致(即 实参与形参按照顺序对应一一传递)

2-2 方法的参数传递机制

参考文献

结论:Java语言中方法的参数传递机制的本质: 值传递(仅此1种)。 [个人结论]

2-2.1 按值传递:基本数据类型/拷贝值

  • 1 Java语言与C/C++相比,参数的传递方法有所不同。
  • 2 对于方法传递的数据类型是基本数据类型时:Java拷贝
  • 3 方法接收的是原来值的一份拷贝(复制),方法接收参数的值。

    (即 方法接收参数的值,但不能改变这些参数的值)
  • 4 demo:

方法调用的时候,传给方法的永远是一个值的副本,入参(即 形参)是一个新变量;
向方法传值相当于:把当前变量的值赋给入参变量;然后,入参变量的值的变动就同当前变量无关了。 a 将 自己的值1赋给变量num,方法内变量num的自增和变量a无关。
因为num的值是a的一个copy,它们没有任何内存共享的语义。

2-2.2 按值传递:引用数据类型/拷贝句柄

  • 1 对于方法传递的数据类型是引用数类型,如:对象(数组也可视为一种特殊的对象)时:Java拷贝句柄(即 对象的引用地址)。

    ∵引用数据类型传递给方法的是数据在内存中的地址,方法中对数据的操作可以改变数据的值。
  • 2 补充:数组中的元素既可是基本类型的数据,也可以是对象。
  • 3 demo:

String对象为不可变(final)的引用对象,每一次的赋值操作即改变一次内存地址


实参变量s把自己的句柄值赋值给了形参变量as。
as拿到句柄值就相当于拿到了StringBuilder实例的控制权。
所以s、as两个变量虽然是各自的句柄值,但s/as指向的是同一个对象。
所以,as的操作会影响s的结果,因为两个变量最终通过句柄指向了同一个实例。


X 参考与推荐文献

[Java SE]Java方法的参数传递机制:值传递的更多相关文章

  1. 我的Java开发学习之旅------>Java语言中方法的参数传递机制

    实参:如果声明方法时包含来了形参声明,则调用方法时必须给这些形参指定参数值,调用方法时传给形参的参数值也被称为实参. Java的实参值是如何传入方法?这是由Java方法的参数传递机制来控制的,Java ...

  2. java之方法的参数传递(值传递和引用传递)

    方法,必须有其所在类或对象调用时才有意义,若方法有参数: 形参:方法声明时的参数: 实参:方法调用时实际传给形参的参数值: java的实参如何传入方法呢? 首先要明确:变量分为两大类:基础数据类型.引 ...

  3. Java方法的参数传递是值传递还是引用传递?

    当基本数据类型(Boolean,byte,char,String,int,Long,float,double)作为参数传递时,传递的是实参值的副本,即传的是值,无论在函数中怎么操作这个副本,实参的值是 ...

  4. java 基础:方法调用中的值传递是call by value,并且传递的是参数的值的拷贝,而不是引用

    public class TestExtends { public static void main(String[]args){ int s = 10; System.out.println(Sys ...

  5. 深入理解Java中方法的参数传递机制

    形参和实参 我们知道,在Java中定义方法时,是可以定义参数的,比如: public static void main(String[] args){ } 这里的args就是一个字符串数组类型的参数. ...

  6. Java方法之参数传递机制

    目录 Java方法之参数传递机制 基本数据类型 引用数据类型 综合练习 总结 Java方法之参数传递机制 Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做 ...

  7. Java高频经典面试题(第一季)四:方法的参数传递机制

    考点? 方法的参数传递机制 String,包装类等对象的不可变性 方法的参数传递机制: ①形参是基本数据类型 传递数据值 ②实参是引用数据类型 传递地址值 特殊的类型:String.包装类等对象不可变 ...

  8. 疯狂java学习笔记之面向对象(三) - 方法所属性和值传递

    方法的所属性: 从语法的角度来看:方法必须定义在类中 方法要么属于类本身(static修饰),要么属于实例 -- 到底是属于类还是属于对象? 有无static修饰 调用方法时:必须有主调对象(主语,调 ...

  9. Java参数传递是值传递还是引用传递?

    当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递? 答:是值传递.Java 语言的参数传递只有值传递.当一个实例对象作为参数被传递到方法中时,参 ...

  10. JavaSE 面试题: 方法的参数传递机制

    JavaSE 面试题 方法的参数传递机制 import java.util.Arrays; public class Test { public static void main(String[] a ...

随机推荐

  1. Docker系列--容器编排工具Docker Compose详解

    1.Docker Compose 概述 Compose是一个用于定义和运行多容器Docker应用程序的工具.使用Compose,您可以使用Compose文件来配置应用程序的服务.然后,使用单个命令,您 ...

  2. redis每天生成自增流水号(001、002...)

    原理:利用redis的RedisAtomicLong类实现该功能:让其每天第一次放置一个新的自增的值(一天过期)然后和每天的日期相加就可以了例子: 20180901 + 001 ;当天就是 20180 ...

  3. 阿里云Linux服务器部署JDK8实战教程

    下载地址 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 文件上传 把下载的文 ...

  4. Verilog 预编译

    Verilog 预编译 Verilog 语言支持宏定义(`define),参数 parameter,局域参数(localparam)以及`include等内容.这些数据常量的支持极大方便数字系统设计. ...

  5. CSS 常用样式-盒模型属性

    盒模型又叫框模型,包含了五个用来描述盒子位置.尺寸的属性,分别是宽度 width.高度 height.内边距 padding. 边框 border.外边距 margin. 常见盒模型区域: • 盒模型 ...

  6. hdu:排列组合(指数型母函数)

    Problem Description有n种物品,并且知道每种物品的数量.要求从中选出m件物品的排列数.例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB",&q ...

  7. hexo相对路径图片显示

    说明 hexo的图片默认不支持相对路径.需要配置 post_asset_folder 选项,设置从false改成true之后支持.但是要求图片目录必须和文件名相同. 由于我在typore下的markd ...

  8. Linux CentOS Docker 安装、加载配置

    Docker Version:2.10.2 OS: CentOS 7 1.卸载 $ sudo yum remove docker \ docker-client \ docker-client-lat ...

  9. NET Core 部署IIS 碰到得问题解决(内托管模式超时、不允许得请求谓词、直接请求无响应、拒绝服务405)

    web.config 配置说明 典型的web.confg 配置. 注意其中hostingModel模式和requestTimeout 进程内托管需要注意使用单独的应用程序池: 请求超时默认5分钟,出错 ...

  10. 使用IDEA的webservice工具解析生成的客户端调用远程接口

    由于这个接口的报文格式比较麻烦,是XML的请求头加上JSON格式的请求体,所以看起来比较复杂,也可以用RPC的方式调用,那样需要将请求头和请求体,响应头和响应体建实体.public JSONObjec ...