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

  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. golang "%p"学习记录随笔

    对于获取slice的指针地址, 通过unsafe.Pointer 和 "%p"占位符两种方式得到的地址是不同的 s := make([]int, 1) t.Log(unsafe.P ...

  2. 1.2Hadoop概述

  3. idea如何通过数据库生成实体类

    ---恢复内容开始--- https://blog.csdn.net/liu_yulong/article/details/72910588 ---恢复内容结束---

  4. Linux系统编程 —线程属性

    在之前的章节中,我们在调用pthread_create函数创建线程时,第二个参数(即线程属性)都是设为NULL,即使用默认属性.一般情况下,使用默认属性已经可以解决我们开发过程中的大多数问题. 但是, ...

  5. 基础篇:深入解析JAVA注解机制

    目录 java实现注解的底层原理和概念 五种元注解详解 使用动态代理机制处理注解 spring.AOP和注解机制 (题外)@FunctionalInterface原理介绍 欢迎指正文中错误 关注公众号 ...

  6. 基础篇:深入解析JAVA泛型和Type类型体系

    目录 1 JAVA的Type类型体系 2 泛型的概念 3 泛型类和泛型方法的示例 4 类型擦除 5 参数化类型ParameterizedType 6 泛型的继承 7 泛型变量TypeVariable ...

  7. 003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程

    003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程 Java程序长啥样? 首先编写一个Java程序 记事本编写程序 打开记事本 1.wi ...

  8. 01 C语言基本介绍

    C语言特点 容易上手学习 结构化语言 执行效率高 处理的工作和活动偏底层 可以在多种计算机平台上编译(类似Java的跨平台) C语言历史 目前,C 语言是最广泛使用的系统程序设计语言之一 C 语言是最 ...

  9. Python3基础——字符串类型

    Text Sequence Type - str(immutable) class str(object='') class str(object=b'', encoding='utf-8', err ...

  10. C/C++的二分查找

    假设有一种温度传感器,已经测得它的电压和温度的对应关系,将电压值以ADC转换后的数字量的值表示,形成温度-AD值的对照表,如下. 大致成一条反比关系的曲线. ADC的底层驱动已经写好,对外有一个接口可 ...