Java传引用问题
Java传引用问题
使用Java调用方法时,可以传值,也可以传引用。下面说说两者的区别:
1.传值
传值中的“值”类型是指java的8大基本类型(基础知识,不知道请自行谷歌)。使用java传值是把实参的值传递给形参,但是对形参所做的任何改变都对实参没有影响。例如以下代码:
public Class Demo{
public static void test(int x){
x++;
System.out.println("方法内,x == "+x);
}
public static void main(String[] args){
int a = 3;
Demo.test(a);
System.out.println("方法外,a == "+a);
}
}
运行结果:
方法内,x == 4
方法外,a == 3
解析:尽管x的值已经加1变成了4,但是当test()方法执行结束后,x就被销毁了,其值不能传回给实参a。学过C的应该知道:向方法中传值是单向的,只能由形参传给实参,不能反过来。在java中亦如此。所以改变形参的值对实参没有影响。
2.传引用
A.在方法内改变引用的指向
如下代码:
public class Test {
public static void main(String[] args) {
Integer a = 20;
System.out.println("修改前:" + a);
TestStudent.modify(a, 900);
System.out.println("修改后:" + a);
}
public static <T> void modify(T a, T b) {
a = b;
}
}
运行结果:
修改前:20
修改后:20
虽然在modify()方法中将a指向了b,但是在方法结束后,modify()方法内的a和b都被销毁了,对main()方法内的实参没有影响。modify()方法只是改变了形参的指向,并未改变实参的指向。如图:
main()方法中的a与modify()方法中的a都指向堆中的同一个对象,但是改变modify()方法中的a的指向对main()方法中的a的指向并没有影响,所以一切都是白费的。
B.在方法内改变引用的对象的属性
倘若在被调用方法内部改变了形参变量引用的对象的属性,会对实参变量引用的对象产生影响。因为形参变量和实参变量引用的是堆中的同一个对象。看下面一个例子:
Student类:
public class Student {
public Student() {
}
public Student(String name, String sex, String tel) {
super();
this.name = name;
this.sex = sex;
this.tel = tel;
}
private String name;
private String sex;
private String tel;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTel() {
return tel;
}
@Override
public String toString() {
return "Student [name=" + name + ", sex=" + sex + ", tel=" + tel + "]";
}
public void setTel(String tel) {
this.tel = tel;
}
}
Test类:
public class TestStudent {
public static void main(String[] args) {
Student s = new Student("Obama", "Male", "10256905");
Student student = new Student("Bill", "Female", "10256905");
System.out.println(" 修改属性");
System.out.println("修改前:" + s);
TestStudent.test(s, "Jeff");
System.out.println("修改后:" + s);
System.out.println("\n 修改指向");
System.out.println("\n修改前:" + s);
TestStudent.modify(s, student);
System.out.println("修改后:" + s);
}
public static void test(Student s, String name) {
s.setName(name);
}
public static <T> void modify(T a, T b) {
a = b;
}
}
运行结果:
修改属性
修改前:Student [name=Obama, sex=Male, tel=10256905]
修改后:Student [name=Jeff, sex=Male, tel=10256905]
修改指向
修改前:Student [name=Jeff, sex=Male, tel=10256905]
修改后:Student [name=Jeff, sex=Male, tel=10256905]
从运行结果可以看出,调用方法改变形参的指向对实参并没有影响。但是如果试图改变形参所指向的对象的属性会对实参所指向的对象产生影响。
综上所述:只有在调用方法内改变引用变量所引用的对象的属性才会对调用方法中的对象产生影响。因为形参变量和实参变量指向堆中的同一个对象。
ps:第一次写技术博客,有不足处还望大家指出来,以后我会慢慢改进。谢谢大家的支持。
Java传引用问题的更多相关文章
- 我终于忍不住喷一下某些书了,关于Java传引用的XX言论
凡是说Java对象传的是引用,简直一派胡言,尤其误导我这种Java初学者,更严重的是以前用过C++的Java初学者. 我们都知道Java建立对象一般都是需要这样的格式: Object obj = ne ...
- java集合中的传值和传引用
在学习java集合过程中发现了传值和传引用的区别: 我们来看下面两句话 ●java集合就像一种容器,我们可以把多个对象(实际上是对象的引用),丢进该容器.(来自疯狂java讲义) ●当使用Iterat ...
- java中的传值与传引用
java函数中的传值和传引用问题一直是个比较“邪门”的问题,其实java函数中的参数都是传递值的,所不同的是对于基本数据类型传递的是参数的一份拷贝,对于类类型传递的是该类参数的引用的拷贝,当在函数体中 ...
- Java是传值还是传引用
http://www.bccn.net/Article/kfyy/java/jszl/200601/3069.html 对于基本数据类型(整型.浮点型.字符型.布尔型等),传值;对于引用类型(对象.数 ...
- Java中传值与传引用
不管Java参数类型是什么,一律传递参数的副本. <Thinking In Java>:“When you're passing primitives into a method,you ...
- java 函数形参传值和传引用的区别
java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. public class TestFun { public static v ...
- java传值和传引用区别
1. 在java中所有的参数都是传值的,引用符号&的传递是C++中才有的:2. 在java传参中,基本类型(byte--short--int--long--float--double--boo ...
- Java内存管理-Stackoverflow问答-Java是传值还是传引用?(十一)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本文导图: 一.由一个提问引发的思考 在Stack Overflow 看到这样一个问题 ...
- Java:传值还是传引用?
这是一个Java的经典问题,大部分人从C,C++语言入门,C语言有三种传递方式:值传递,地址传递和引用传递.详细的对C语言指针,引用的我个人的理解,见链接. Java所有操作都是传值操作!都是传值操作 ...
随机推荐
- scrapy_redis之官网列子domz
一. domz.py from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, ...
- kindeditor<=4.1.5文件上传漏洞
最近发现很多网页篡改与暗链都是利用kindeditor编辑器,于是搜了一下kindeditor的漏洞,发现低于4.1.5版本的存在文件上传的漏洞,可以上传txt,html后缀的文档,许多恶意的文档貌似 ...
- Exception 'ReflectionException' with message 'Class require does not exist'
记录一下今天遇到的错误 在使用 <?= $form->field($model, 'content')->textarea() ?> 的时候报错 Exception 'Ref ...
- CDH与原生态hadoop之间的区别(转)
需要认识的几个问题 ------------------------------------------------------------------------------------------ ...
- TOJ 2861 Octal Fractions
描述 Fractions in octal (base 8) notation can be expressed exactly in decimal notation. For example, 0 ...
- unity的技术博客
技术博客 http://www.cnblogs.com/wangergo/
- 【Linux】Linux下使用Docker快速部署Oracle数据库
安装最新Docker wget -qO- https://get.docker.com/ | sh` 安装 docker-compose sudo curl -L https://github.com ...
- mysql limit查询(分页查询)探究
MySQL的Limit子句 LIMIT offset,length Limit子句可以被用于强制 SELECT 语句返回指定的记录数.Limit接受一个或两个数字参数.参数必须是一个整数常量.如果给定 ...
- 【转】Python中不尽如人意的断言Assertion
原文地址:Python中不尽如人意的断言Assertion Python Assert 为何不尽如人意 Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛 ...
- core核心模块
5. core核心模块 核心模块会通过compiler模块提供的调用compiler的功能, 将用户的输入转为VM直接的输入 编译模块用来编译, 而核心模块用来执行 在core.h文件中 // 不需要 ...