基本数据类型

public class ParamTest {
public static void main(String[] arge) {
double percent = 10;
System.out.println("Testing tripleValue:");
System.out.println("Before: percent="+ percent);
tripleValue(percent);
System.out.println("After: percent=" +percent);
}
public static void tripleValue(double x){
x = x * 3;
System.out.println("End of method x=" + x);
}
}

运行结果是

Testing tripleValue:

Before: percent=10.0

End of method x=30.0

After: percent=10.0

我们可以发现percent的值没有改变,下面看一下具体的执行过程

  • x被初始化为percent值的一个拷贝
  • x乘以3变成30,此时percent仍然是10
  • 方法结束,参数x不再使用

我们可以得出一个结论就是一个方法不能修改一个基本数据类型的参数

对象参数

	public class ParamTest {
public static void main(String[] arge) {
System.out.println("Testing tripleSalary:");
Employee harry = new Employee("Harry", 50000);
System.out.println("Before: salary=" + harry.getSalary());
tripleSalary(harry);
System.out.println("After: salary=" + harry.getSalary());
} public static void tripleSalary(Employee x){
x.raiseSalary(200);
System.out.println("End of method: salary=" + x.getSalary());
} } class Employee{
private String name;
private double salary; public Employee(String n,double s){
name = n;
salary = s;
} public String getName() {
return name;
} public double getSalary() {
return salary;
} public void raiseSalary(double byPercent){
double raise = salary * byPercent / 100;
salary += raise;
} }

运行结果

Testing tripleSalary:

Before: salary=50000.0

End of method: salary=150000.0

After: salary=150000.0

我们可以发现salary数值发生了改变,下面看一下执行过程

  • x被初始化为harry值的拷贝,这里是一个对象引用
  • 调用raiseSalary方法,x和harry变成150000
  • 方法结束后,参数x不再使用

我们可以得出一个结论就是一个方法可以改变一个对象参数的状态

对象引用

public class ParamTest {
public static void main(String[] arge) {
System.out.println("Testing swap:");
Employee a = new Employee("Alice",70000);
Employee b = new Employee("Bob",60000);
System.out.println("Before: a="+ a.getName());
System.out.println("Before: b="+ b.getName());
swap(a,b);
System.out.println("After: a=" + a.getName());
System.out.println("After: b=" + b.getName()); } public static void swap(Employee x,Employee y){
Employee temp = x;
x = y;
y = temp;
System.out.println("End of method: x=" + x.getName());
System.out.println("End of method: y=" + y.getName());
} }

运行结果是

Testing swap:

Before: a=Alice

Before: b=Bob

End of method: x=Bob

End of method: y=Alice

After: a=Alice

After: b=Bob

我们可以得出一个结论就是一个方法不能让对象参数引用一个新的对象

java传值与传引用总结的更多相关文章

  1. java传值与传引用

    一.传值与传引用 1.不管java参数的类型是什么,一律传递参数的副本. 在thinking in java中,明确指出,如果java是传值,那么传递的是值的副本,如果java传递的是引用,那么传递的 ...

  2. java传值和传引用区别

    1. 在java中所有的参数都是传值的,引用符号&的传递是C++中才有的:2. 在java传参中,基本类型(byte--short--int--long--float--double--boo ...

  3. Java : 传值or传引用?

    那看看这句经典名言:O'Reilly's Java in a Nutshell by David Flanagan (see Resources) puts it best: "Java m ...

  4. java关于传值与传引用

    关于java传值还是传引用的问题经常出现在一些烦人的面试题中,主要考察个人对java基础的掌握情况. 首先明确一下:本地方法中,java的参数传递都是传值.但是如果是远程调用方法时,会将对象本身传递过 ...

  5. java集合中的传值和传引用

    在学习java集合过程中发现了传值和传引用的区别: 我们来看下面两句话 ●java集合就像一种容器,我们可以把多个对象(实际上是对象的引用),丢进该容器.(来自疯狂java讲义) ●当使用Iterat ...

  6. java中的传值与传引用

    java函数中的传值和传引用问题一直是个比较“邪门”的问题,其实java函数中的参数都是传递值的,所不同的是对于基本数据类型传递的是参数的一份拷贝,对于类类型传递的是该类参数的引用的拷贝,当在函数体中 ...

  7. Java中传值与传引用

    不管Java参数类型是什么,一律传递参数的副本. <Thinking In Java>:“When you're passing primitives into a method,you ...

  8. java 函数形参传值和传引用的区别

    java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. public class TestFun { public static v ...

  9. Java内存管理-Stackoverflow问答-Java是传值还是传引用?(十一)

    勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本文导图: 一.由一个提问引发的思考 在Stack Overflow 看到这样一个问题 ...

随机推荐

  1. Vagrant下共享目录下静态文件(js/jpg/png等)修改完运行报错

    利用Vagrant部署开发环境,使用目录共享模式,在本地磁盘进行开发,通过虚拟机环境运行开发的页面. 接下来打开页面,看上去一切正常,接下来将发生一个神奇的事情,你修改一个css文件,在刷新浏览器,发 ...

  2. 03标准对象-01-Date和JSON

    0.写在前面的话 在JS世界中,一切都是对象,区别对象类型使用tyepof,返回一个字符串,如: typeof 123; // 'number' typeof NaN; // 'number' typ ...

  3. 如何使用sourcetree 或 IDEA 自带的git合并代码?

    如何将本地的wyy分支合并并推送到远端的 develop分支? 规则:最好是本地的分支wyy推送到对应的远端origin/wyy ,不建议直接推送到远端不同的分支!!所以 基本思路如下: 1.本地的w ...

  4. 【转】SWT/JFace的对话框

    一.MessageDialog       ,MessageDialog的用法很简单 MessageDialog.openInfomation(shell,title,message);       ...

  5. jmeter JDBC请求连接测试mysql数据库

    所有jmeter基本组件功能本文不做介绍.jmeter要链接mysql数据库,首先得下载mysql jdbc驱动包(注:驱动包的版本一定要与你数据库的版本匹配,驱动版本低于mysql版本有可能会导致连 ...

  6. 走进Node.js 之 HTTP实现分析

    作者:正龙(沪江Web前端开发工程师) 本文为原创文章,转载请注明作者及出处 上文"走进Node.js启动过程"中我们算是成功入门了.既然Node.js的强项是处理网络请求,那我们 ...

  7. iOS Storyboard约束详解

    链接:http://www.jianshu.com/p/b88c65ffc3eb 约束,就是指--此处略去1万字--都懂的,就不说了.直接进入实战环节. 本文的控件约束都是围绕着UITableView ...

  8. iOS9.3越狱

    转载:http://bbs.feng.com/read-htm-tid-10680439.html   首先是Windows英文版越狱的的教程 下载 Cydia Impactor 工具(用来安装越狱A ...

  9. 使用 Dawn 构建 React 项目

    开发一个 React 项目,通常避免不了要去配置 Webpack 和 babel 之类,以支持 commonjs 或 es 模块及各种 es 新语法,及及进行 jsx 语法的转义.当然也可以用 cre ...

  10. 初学node.js有感二

    node.js进阶 一.回顾与继续   对于一种语言的认识都是经历这样的一个过程的,首先从原生的环境(CMD)中开始学习,找到一门语言之间各种引用的本质和相互之间的调用方式,明澈各种依赖关系,在这个基 ...