按值调用表示方法接收的是调用者提供的值;而按引用调用表示方法接收的是调用者提供的变量地址;一个方法可以修改传递引用所对应的变量值, 而不能修改传递值调用所对应的变量值;

  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语言对对象采用的是引用传递还是按值传递?的更多相关文章

  1. java 中对对象的调用

    java程序设计语言对对象采用的不是引用的调用,实际上对象引用进行的是值得传递.(from:核心卷1  page:123)

  2. java基本数据类型传递与引用传递区别

    文章转载自  zejian的博客http://blog.csdn.net/javazejian/article/details/51192130 java的值传递和引用传递在面试中一般都会都被涉及到, ...

  3. Java是值传递还是引用传递?

    Java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题.这个问题一般是相对函数而言的,也就是Java中所说的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法的两 ...

  4. Java 值传递 or 引用传递?

    Java 方法传参 值传递 or 引用传递? 结论:Java采用的是值传递 先建立一些基础的概念 什么是值传递和引用传递? 值传递(pass by value):是指在调用函数时将实际参数复制一份传递 ...

  5. java是值传递还是引用传递

    首先写一个简便的Employee,以便测试使用. class Employee { private String name; public Employee(String name) { this.n ...

  6. Java语言的9个主要特性

    Java作为时下很流行的一门编程语言,受到很多人的热爱,那么它有哪些特性呢?一起来看看吧. 1.Java语言是简单的 Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用.另 ...

  7. 【转】java方法参数传递方式--按值传递、引用传递

    java的方法参数传递方式有两种,按值传递和引用传递 1.按值传递 参数类型是int,long等基本数据类型(八大基本数据类型),参数传递的过程采用值拷贝的方式 代码片段1: public class ...

  8. Java值传递还是引用传递?

    回顾: 在程序设计语言中,将参数传递分为按值调用和按引用调用.按值调用:表示方法接收的是调用者提供的值.而按引用调用表示方法接收的是调用者提供的变量地址.一个方法可以修改传递引用所对应的变量值,而不能 ...

  9. Java中到底是值传递还是引用传递?

    Java中到底是值传递还是引用传递? 我们先回顾一下基本概念 实参和形参 参数在编程语言中是执行程序需要的数据,这个数据一般保存在变量中.在Java中定义一个方法时,可以定义一些参数, 举个例子: p ...

随机推荐

  1. redis并发问题2

    转自https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247485464&idx=1&sn=8d690fc6f878 ...

  2. python文档翻译之使用python解释器

    Python解释器通常安装在/usr/local/bin/python3.6,把/usr/local/bin目录设置到UNIX shell的搜索路径就可以使用下面的命令运行python: python ...

  3. 2020华为杯数学建模B题-RON建模 赛后总结与分析

    好久好久没有写博客了...挺累的,从二月份开始找暑期实习,接着在进行暑期实习,然后马不停蹄地进行秋招,现在总算结束实习,前两天又参加了华为杯数学建模竞赛,感觉接下来就会很轻松了,希望能好好休息休息.这 ...

  4. 关于windows服务器wsus客户端配置的修改

    本文环境如下: 服务器:Windows Server 2012 R2 Standard 由于公司服务器是加了域环境的,又需要将wsus客户端指向另一台wsus服务器,修改本地组策略.可能会被域控给修改 ...

  5. ip子网掩码计算及子网划分

    为什么要懂 子网掩码计算,及子网划分属于网络基础知识.一般在几个地方会用到: 公司避免产生网络风暴而划分子网,帮助路由器判断对应主机是否在同一个网段中 服务器相互隔离而划分子网,一般机房管理人员规划: ...

  6. 浅谈Java多线程

    线程与进程 什么是进程? 当一个程序进入内存中运行起来它就变为一个进程.因此,进程就是一个处于运行状态的程序.同时进程具有独立功能,进程是操作系统进行资源分配和调度的独立单位. 什么是线程? 线程是进 ...

  7. 曹工说Tomcat:200个http-nio-8080-exec线程全都被第三方服务拖住了,这可如何是好(上:线程模型解析)

    前言 这两年,tomcat慢慢在新项目里不怎么接触了,因为都被spring boot之类的框架封装进了内部,成了内置server,不用像过去那样打个war包,再放到tomcat里部署了. 但是,内部的 ...

  8. 谁说ParameterMap只能读不能写?

    开发过javaweb项目的同学,应该都接触过ServeltRequest吧?ServletRequest接口中有一个方法叫做getParameterMap(),他会返回一个Map<String, ...

  9. jdbc原理与步骤

    jdbc原理 1.加载JDBC驱动,并将其注册到DriverManager 2.建立数据库连接,获取connection对象 3.建立Statement对象或PreparedStatement对象 4 ...

  10. 一加云耳2和一加云耳z区别

    [解码方式]:云耳Z采用的音源解码方式是AAC,云耳2使用的是APTX: [发声单元]:云耳Z采用的是动圈,云耳2采用的是动圈+动铁组合 [颜色]:云耳Z有4款颜色(宝蓝.薄荷绿.黑色.米白)云耳2有 ...