Java语言对对象采用的是引用传递还是按值传递?
按值调用表示方法接收的是调用者提供的值;而按引用调用表示方法接收的是调用者提供的变量地址;一个方法可以修改传递引用所对应的变量值, 而不能修改传递值调用所对应的变量值;
Java语言对对象采用的是引用传递还是按值传递?下面举个例子说明;
public class ParamTest {
public static void main(String[] args) {
System.out.println("---测试1 tripleValue---");
double percent = 10;
System.out.println("Before percent:" + percent);
tripleValue(percent);
System.out.println("After percent:" + percent);
System.out.println("---测试2 tripleSalary---");
Employee harry =new Employee("Harry", 5000, 1);
System.out.println("Before salary:" + harry.getSalary());
tripleSalary(harry);
System.out.println("After salary:" + harry.getSalary());
System.out.println("---测试3 swap---");
Employee emp1 =new Employee("Alice", 1000, 1);
Employee emp2 =new Employee("Bob", 1000, 1);
System.out.println("Before emp1:" + emp1);
System.out.println("Before emp2:" + emp2);
swap(emp1, emp2);
System.out.println("After emp1:" + emp1);
System.out.println("After emp2:" + emp2);
}
public static void swap(Employee e1, Employee e2) {
Employee tmp = e1;
e1 = e2;
e2 = tmp;
}
public static void tripleSalary(Employee x) {
x.setSalary(200);
System.out.println("End of method salary:" +
x.getSalary());
}
public static void tripleValue(double x) {
x *= 3;
System.out.println("End of method x:" + x);
}
}
Employee实体类:
public class Employee {
private String name;
private double salary;
private int id;
public Employee(String name, double salary, int id) {
this.name = name;
this.salary = salary;
this.id = id;
}
public Employee() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double byPercent) {
double raise = this.salary * byPercent / 100;
this.salary += raise;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", salary=" + salary +
", id=" + id +
'}';
}
}
上面的测试代码的结果是:
---测试1 tripleValue---
Before percent:10.0
End of method x:30.0
After percent:10.0
---测试2 tripleSalary---
Before salary:5000.0
End of method salary:15000.0
After salary:15000.0
---测试3 swap---
Before emp1:Employee{name='Alice', salary=1000.0, id=1}
Before emp2:Employee{name='Bob', salary=1000.0, id=1}
After emp1:Employee{name='Alice', salary=1000.0, id=1}
After emp2:Employee{name='Bob', salary=1000.0, id=1}
对于测试1,方法的参数为基本类型,一个方法试图将一个参数值增加至3倍,不过该方法调用后,percent的值还是10;它的执行过程(如下图):
1 ) x 被初始化为 percent 值的一个拷贝;
2) x被乘以 3后等于 30,但是percent仍然是10
3 ) 这个方法结束之后,参数变量 X不再使用;

从测试1可以看出一个方法不可能修改一个基本数据类型的参数;
对于测试2,方法的参数为对象的引用,具体的执行过程(如下图):
1 ) X 被初始化为 harry 值的拷贝,这里是一个对象的引用;
2 ) setSalary方法应用于这个对象引用,x 和 harry 同时引用的那个 Employee 对象的salary;
3 ) 方法结束后,参数变量x不再使用,但是对象变量harry继续引用那个雇员对象;

对于测试3,swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这个变量的拷贝(如下图):

通过上面的测试说明,Java语言对对象采用的按值传递,而不是引用传递;
- 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型);
- 一个方法可以改变一个对象参数的状态;
- 一个方法不能让对象参数引用一个新的对象;
参考:《Java核心技术卷一基础知识》的第4章第5节
Java语言对对象采用的是引用传递还是按值传递?的更多相关文章
- java 中对对象的调用
java程序设计语言对对象采用的不是引用的调用,实际上对象引用进行的是值得传递.(from:核心卷1 page:123)
- java基本数据类型传递与引用传递区别
文章转载自 zejian的博客http://blog.csdn.net/javazejian/article/details/51192130 java的值传递和引用传递在面试中一般都会都被涉及到, ...
- Java是值传递还是引用传递?
Java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题.这个问题一般是相对函数而言的,也就是Java中所说的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法的两 ...
- Java 值传递 or 引用传递?
Java 方法传参 值传递 or 引用传递? 结论:Java采用的是值传递 先建立一些基础的概念 什么是值传递和引用传递? 值传递(pass by value):是指在调用函数时将实际参数复制一份传递 ...
- java是值传递还是引用传递
首先写一个简便的Employee,以便测试使用. class Employee { private String name; public Employee(String name) { this.n ...
- Java语言的9个主要特性
Java作为时下很流行的一门编程语言,受到很多人的热爱,那么它有哪些特性呢?一起来看看吧. 1.Java语言是简单的 Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用.另 ...
- 【转】java方法参数传递方式--按值传递、引用传递
java的方法参数传递方式有两种,按值传递和引用传递 1.按值传递 参数类型是int,long等基本数据类型(八大基本数据类型),参数传递的过程采用值拷贝的方式 代码片段1: public class ...
- Java值传递还是引用传递?
回顾: 在程序设计语言中,将参数传递分为按值调用和按引用调用.按值调用:表示方法接收的是调用者提供的值.而按引用调用表示方法接收的是调用者提供的变量地址.一个方法可以修改传递引用所对应的变量值,而不能 ...
- Java中到底是值传递还是引用传递?
Java中到底是值传递还是引用传递? 我们先回顾一下基本概念 实参和形参 参数在编程语言中是执行程序需要的数据,这个数据一般保存在变量中.在Java中定义一个方法时,可以定义一些参数, 举个例子: p ...
随机推荐
- 关于AES的S盒子的计算
对于置换piS 有如下计算: The matrix used in AES is a rotational matrix based on the value 0x1F, which is 00011 ...
- Spring注解不生效原因总结
在Spring的注解学习中发现使用(@Resource.@PostConstruct. @PreDestroy)这三个注解时不生效.使用@Resource发生空指针异常,说 明被注解对象没有被成功注入 ...
- CSS、bootstrap4等相关疑难杂症
说明 本篇博客仅用于个人随笔,所以内容比较随意. 在bootstrap4中,引入样式后,按钮.输入框等组件的选取状态会出现黑色加重边框,该如何解决? 解决示例: input:focus{outline ...
- 容器云平台No.9~kubernetes日志收集系统EFK
EFK介绍 EFK,全称Elasticsearch Fluentd Kibana ,是kubernetes中比较常用的日志收集方案,也是官方比较推荐的方案. 通过EFK,可以把集群的所有日志收集到El ...
- web自动化(python)——selenium工具基本使用
WebDriver基本操作 生成driver--启动浏览器 #启动谷歌浏览器,预先安装chromedrvier插件 from selenium import webdriver driver = we ...
- Spring Boot 知识清单(一)SpringApplication
爱生活,爱编码,微信搜一搜[架构技术专栏]关注这个喜欢分享的地方.本文 架构技术专栏 已收录,有各种JVM.多线程.源码视频.资料以及技术文章等你来拿. 一.概述 目前Spring Boot已经发展到 ...
- Tomcat 第四篇:请求处理流程(上)
1. 引言 既然是在讲 Tomcat ,那么一个 HTTP 请求的请求流程是无论如何也绕不开的. 首先抛开所有,使用我们现有的知识面,猜测一下一个请求被 Tomcat 处理的过程: 1. 客户端(浏览 ...
- 实用向—总结一些唯一ID生成方式
在日常的项目开发中,我们经常会遇到需要生成唯一ID的业务场景,不同的业务对唯一ID的生成方式与要求都会不尽相同,一是生成方式多种多样,如UUID.雪花算法.数据库递增等:其次业务要求上也各有不同,有的 ...
- 最新版PyCharm激活教程!有效期至2089年!
Python的编译器有很多,像Pycharm.VsCode.Jupyter...哪个好用不做评价,各有各的优点!用过PyCharm的同学都知道,PyCharm有两大版本,专业版和社区版,专业版相当于社 ...
- Centos-用户管理-useradd userdel usermod groupadd groupdel id
linux是多用户.多任务操作系统 linux角色分类 超级用户 root # 管理员.特定服务主进程 0 普通用户 $ 普通管理员.服务运行需要的用户 500~65535 虚拟用户 不能登录 ...