基本数据类型

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. 201521123110 《Java程序设计》第1周学习总结

    第一周学习总结 本周开始了对java的初次学习接触,Java是一门新的编程语言不同于C,由于有了c的基础,对于Java的理解和学习也相对从前学C更容易些. 也学习了Java的诞生发展以及运用包括JVN ...

  2. 深入理解计算机系统chapter8

    进程轮流使用处理器 父进程调用fork来创建一个新的子进程 回收子进程 waitpid/wait 非本地跳转:

  3. SAP Gateway简介

    SAP Gateway在S4/HANA时代的ABAP开发模型中有着重要的地位.SAP Gateway是什么?它对ABAP开发有怎样的影响?可以为我们提供哪些方便?这篇译文将浅要地讨论这些话题. SAP ...

  4. Quartz源码——Quartz调度器的Misfire处理规则(四)

    Quartz调度器的Misfire处理规则 调度器的启动和恢复中使用的misfire机制,还需细化! SimpleTrigger的misfire机制 默认的 Trigger.MISFIRE_INSTR ...

  5. Free Goodies UVA - 12260 贪心

      Free Goodies Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu [Submit ...

  6. 深入理解C# 静态类与非静态类、静态成员的区别 [转载]

    静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...

  7. Apache ab测试工具使用方法(无参、get传参、post传参)

    Ab测试工具是apache自带的测试工具,具有简单易上手的特性,下面我总结一下我的使用方法,首先去官方下载apache程序包,我下的最新版本apache2.4.23,下载地址http://httpd. ...

  8. ubuntu中使用usb-creator制作live usb

    1.实验环境 ubuntu14.04 2.启动usb-creator 2.1 单击桌面左上角的搜索图标,输入usb-creator,然后选择“应用程序"中的”启动盘创建器“ 2.2 终端中输 ...

  9. python Synchronization between processes

    进程间同步,可以使用lock进行控制. 官方文档的例子如下: from multiprocessing import Process, Lock def f(l, i): l.acquire() pr ...

  10. 用html+css+js做打地鼠小游戏

    html 代码 first.html <!DOCTYPE html> <html lang="en"> <head> <meta char ...