java学习——java按值传递和按址传递
先复制一个面试/笔试的题:
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答案:
是值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。C++和C#中可以通过传引用或传输出参数来改变传入的参数的值。在C#中可以编写如下所示的代码,但是在Java中却做不到。
java中的按值传递和按址传递(按引用传递),要明白这两个概念,要理解按值和按址。
下面举个简单的例子来说明:
比如你去国外旅行,拍了一张特别好的照片,你想分享给你的朋友,那么有两种方式,第一种是你直接将这个照片发送给你的朋友,也就是给你朋友这个照片的副本;第二种是假如你将这张及其好的照片上传到一个QQ(微博)等,你将会得到一个访问这个照片的地址(Url),此时在将这个url分享给你的朋友。
如上例子,第一种可以认为是按值传递,第二种可以认为是按址传递(按引用传递)。知道了这个概念。在进行下面的简单分析。
按值传递:只有当参数为基本类型变量的时候,java按这种策略的方式传递。
上面的分享照片,你的朋友拿到的照片是你的副本,那么朋友对照片的修改不会影响你的照片,你对照片的修改也不会影响到你给朋友分享的照片。按址传递:只有当参数为引用类型变量,java按这种策略方式进行传递。
上面的Url地址给朋友,那么如果朋友也有修改的权限,朋友对照片进行操作,自己访问的照片就是朋友操作结果后的结果。
下面通过代码来解释这个例子:
package com.dufy.reforvalue;
import java.util.Arrays;
/**
* java中 按值传递和按址传递
* 按值传递:基本类型变量-按值传递,按值传递通过复制获取参数的副本
* 按址传递:引用类型变量-按址传递,按址传递通过传递对象的引用地址
*
* @author dufy
* @creation 2017年2月9日
*/
public class ReferenceOrValue {
/**
* 基本类型,按值传递
* 举例:给朋友分享你的照片,对方接收的是你的照片的一个实际的副本,
* 你和朋友分别对各自的照片进行操作,不会影响彼此的照片!
*/
public static void testVal(int photo){
photo++;//朋友对照片进行修改
System.out.println("My friend see photo = " + photo);
}
/**
* 引用类型:按址传递
* 举例:给朋友分享你的照片,分享的是你上传网上的一个照片的Url(地址),
* 你和朋友都可以通过这个地址访问照片,并对照片进行一个操作!
*/
public static void testRef(Photo photo){
photo.setPhoto("java Photo,Great!");//朋友对你的照片进行修改
System.out.println("My friend see photo = " + photo.getPhoto());
}
/**
* 引用类型:按址传递
* 因为数组是一个引用类型。所以传递进去的是它们的引用,故在方法中互换了它们的值,也必然影响到它们原来的值.
*/
public static void testArrayRef(int[] array){
for (int i = 0; i < array.length; i++) {
array[i] = 0;
}
System.out.println("testArrayRef array is = "+Arrays.toString(array));
}
public static void main(String[] args) {
//一:按值传递
int photo = 10;//定义要发送的照片
testVal(photo);//将照片发发送你朋友,朋友得到的是一个副本
System.out.println("My see photo = " + photo);
//二:按址传递
Photo p = new Photo();//定义一个照片的对象,我自己拍摄的java photo
p.setPhoto("java photo");
testRef(p);//将照片对象(即 Url地址) 发送你朋友,朋友得打的是一个Url(地址),Url打开才是照片
System.out.println("My friend see photo = " + p.getPhoto());
//三:数组也是对象,数组在堆内存。引用是在栈。
int array[] = {1,2,3,4,5};
testArrayRef(array);
System.out.println("array is = "+Arrays.toString(array));
}
/**
* 照片类
*/
static class Photo{
String photo;
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
}
}
输出的结果如下:
My friend see photo = 11
My see photo = 10
My friend see photo = java Photo,Great!
My friend see photo = java Photo,Great!
testArrayRef array is = [0, 0, 0, 0, 0]
array is = [0, 0, 0, 0, 0]
小插曲:有下下面这一道题:这个method应该怎么写呢?
public static void main(String[] args) {
int a = 10;
int b = 20;
method(a,b);//需要在method被调用后,仅打印出a=100,b=200,请写出method(a,b)方法!
System.out.println("a = " + a);
System.out.println("b = " + b);
}
肯定有很多人和我之前一样,想都没想就写出下面的代码:
private static void method(int a, int b) {
a*=10;
b*=10;
}
但是运行结果后你会发现,没有打印出理想的结果!
这时候如果你仔细看来了上面的介绍就不难理解为什么会出现这样的结果了!
给出这道题可能正确的结果:
private static void method(int a, int b) {
System.out.println("a=100,b=200");
System.exit(0);
}
你觉得正确的答案是什么,可以给我留言和评论,欢迎讨论!
java到底是值传递还是引用传递? 知乎:https://www.zhihu.com/question/31203609
你会swap吗,按值传递还是按引用?:http://www.cnblogs.com/foreach-break/p/call-by-reference-OR-call-by-value.html
欢迎访问我的csdn博客,我们一同成长!
"不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!"
http://blog.csdn.net/u010648555
java学习——java按值传递和按址传递的更多相关文章
- [Java学习] Java虚拟机(JVM)以及跨平台原理
相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...
- Java学习笔记-按值传递
参数的值传递 实参必须与方法中次你故意的参数在次序和数量上匹配,在类型上兼容.类型兼容是指不需要经过显式的类型转换,实参的值就可以传递给形参.如将int型的实参值传递给double型形参. 当调用方法 ...
- java学习——java中的反射学习笔记
Java--reflect 一.Class类的使用 什么是Class类? 1:在面向对象的世界中,万事万物皆对象. java语言中,静态的成员,普通数据类型类是不是对象呢? 是,对象!是类的对象! 类 ...
- 【转】Java学习---Java Web基础面试题整理
[原文]https://www.toutiao.com/i6592359948632457731/ 1.什么是Servlet? 可以从两个方面去看Servlet: a.API:有一个接口servlet ...
- [Java学习] Java异常处理基础
Java异常是一个描述在代码段中发生的异常(也就是出错)情况的对象.当异常情况发生,一个代表该异常的对象被创建并且在导致该错误的方法中被抛出(throw).该方法可以选择自己处理异常或传递该异常.两种 ...
- Java学习---Java代码编写规范
编码规范 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的编程风格,兹制定下述Java编程规范,以规范系统Java部分编程.系统继承的其它资源中的源程序也应按此规 ...
- Java学习----Java概述
一.常用DOS命令 d: 盘符切换 dir(directory) 列出当前目录下的文件以及文件夹 md (make directory) 创建目录 rd (remove director ...
- JAVA学习-JAVA环境准备
dir:列出当前目录下的文件以及文件夹md: 创建目录rd: 删除目录cd: 进入指定的目录,打开文件夹cd..:退回到上一级目录cd/或cd\:退回到根目录del:删除文件d: : 切换到D盘根 ...
- JAVA学习.java.sql.date 与java.util.date以及gettime()方法的分析
java.sql.Date 是针对SQL语句使用的,它只包含日期而没有时间部分. java.util.Date 就是在除了SQL语句的情况下面使用. 它都有getTime方法返回毫秒数,返回的是自19 ...
随机推荐
- 第一篇--认识Jmeter
Jmeter是Apache组织开发的基于Java的压力测试工具,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 它可以用于测试静态和动态资源,例如静态文件.Java 小服务程序.CGI 脚 ...
- [2013-02-22]info入门FAQ
linux相关的东西,入门最快捷,最通用的方式无非查阅帮助文档. man命令很好理解,就不讲了,这里就提几个info相关的FAQ(也就3点啦) 基本操作,如何入门info 首先,输入info命令 ,进 ...
- jsp窗口关闭的触发函数
功能:当点击窗口[关闭按钮]时调用后台的servlet方法实现附件删除 <script type="text/javascript"> window.onbefo ...
- JavaScript实现省市联动
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- IntelliJ IDEA使用(一)基本设置与类、方法模板设置
其实之前一直开发都是在使用的是Eclipse,但是最近在做Maven项目的时候要用IntelliJ IDEA,据说这个idea功能非常的强大,最近在使用的时候发现如果适应的真的是非常的强大.感觉是比E ...
- tkinter第三章(单选和多选)RadioButton CheckButton
最简单的CheckButton多选类 import tkinter as tk #checkButton的内容,多选 root = tk.Tk() v = tk.IntVar()#装整形变量的 #va ...
- 【Alpha】——Seventh Scrum Meeting
一.今日站立式会议照片 二.每个人的工作 成员 昨天已完成的工作 今天计划完成的工作 李永豪 将项目做成APK 用户界面改善 郑靖涛 协助设计账目一览表板块 用户界面改善 杨海亮 查询功能测试 用户界 ...
- 团队作业4——第一次项目冲刺(Alpha版本) Day1
1.开站立式会议: 2.Leangoo任务分解图: 3.开会讨论的结果,任务分派 队员 今日进展 明日安排 林燕 调查产品的市场需求,学习微信开发 完善逻辑架构框架 王李焕 结合实际分析系统设计思路, ...
- 201521123067 《Java程序设计》第3周学习总结
201521123067 <Java程序设计>第3周学习总结 1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用 ...
- 201521123017 《Java程序设计》第1周学习总结
1. 本章学习总结 (1)对JAVA的历史发展的了解 (2)JAVA运行环境的搭建和JVM,JDK,JRE的相关的JAVA开发工具的认识及其掌握 (3)写法的不同,开头public class 文件名 ...