java获取对象属性和值中引用传递和值传送的区别

问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
public class TestMain {
public static void main(String[] args) {
Person p1 = new Person(10);
modify(p1);
//修改p1引用的对象
System.out.println(p1);
public static void modify(Person p){ //使用此函数修改引用的指向
p = new Person(20);
class Person {
//实验用类
public String toString() {
return "Person [age=" + age + "]";
public Person(int age) {
this.age =
输出结果什么是
Person [age=10]不应该是Person [age = 20] 么?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
是时候展现一下我的JAVA基础知识了,2333。我按照执行顺序给你写注释好了。
Person p1 = new Person(10);
//创建了一个对象
//p1.age=10;
modify(p1);
//modify函数传参,创建了一个在modify函数里面的局部变量p
//你应该明白p是一个新的变量,这里类似于执行了p=p1,这两个是指向的同一个对象的
//p.age=10;
p = new Person(20);
//注意,这里!这里!
//这里是p被重新赋值了,p指向了新的对象new Person(20);
//p.age=20;
//和p1指向的那个对象一毛线关系都没有啊
所以,你的代码是在函数内部,把局部变量给重新赋值了。是没法修改到外面的对象的,因为你已经把唯一能访问到外面那个p1的p给重新赋值了!
public static void modify(Person p){
p.age=20; //只有这样才能修改对象!
同理,如果你写成这样:
public static void modify(Person p){
p =//对外面的p1没有任何影响
我举个例子,你就比较好理解了。你创建了一个个元素的数组,比如就叫p1,你把数组通过参数传进函数里面,那么:这个参数p(类似于p = p1),p和p1他们是指向同一个对象。不是说modify(int[] p)重新创建了个元素的数组。这个应该很好理解。
那么:然后你通过p的内置函数怎么操作p都行,都是操作的那个元素的数组。但是,你不能把p重新赋值啊。重新赋值它就不是之前那个数组啦!
比如:你重新p = new int[],就创建了一个新的个元素的数组啊。你执行p = null,也只是销毁了这个引用,不让它指向个元素的数组而已。对外面p1的那个数组不会再有任何影响了。
看到答案里好多人对这个有误解额。。。说不是一个对象的。说不能在函数里改变参数指向的对象的。说int是传值的。说什么的都有,2333。
补充:关于JAVA的函数传参数,你应该也听说过,所谓"基本数据类型是传递的值,其它都是传递的引用"。个人理解是这样的。你传递个Person的对象进去,你可以用SetAge()什么的修改这个对象。但是基本的数据类型,比如Integer、String等等,他们没有什么内置函数能改变他们自己。所以,你传递进去一个int的参数,就算其实是传递的引用,你也只能对int做重新赋值,一重新赋值,就表现成传递的是"值"(永远影响不到函数外面)。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
首先你得知道什么是值传递和引用传递。引用传递本身其实是传递内存地址,即一个数字。而数字这样的基本类型传递是复制传递,即拷贝一个值从实参到形参,两者改变互不影响。
public class TestMain {
public static void main(String[] args) {
Person p1 = new Person(10); // 1. 假设这里的Person(10)对象保存的内存地址为:01002
modify(p1);
// 2. 将01002地址传入,将复制01002给实参,但是p1还是01002
System.out.println(p1); // 4. 打印出p1(01002)指向的对象,则还是之前的Person(10)
public static void modify(Person p){
p = new Person(20); // 3. 假设这里的Person(20)的内存地址为01010,然后赋值给了p。但是由于p是上面p1的一个拷贝,p的改变不影响p1,因此函数结束后p1依旧是01002
// 5. 但是这里如果是类似p.setAge()这样的话,由于并没有改变引用值(即地址),所以这里的操作是去改变p1指向的对象
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你的p1和p根本就不是同一个对象,如果是静态方法请加上return。如果我说的不对请指出来。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
其实p = new Person(20)是重新开辟了一个内存地址,跟原来的那个p1没有任何的关系了。如果是
public static void modify(Person p){
这样结果就是20了。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
public static void main(String[] args) {
Person p1 = new Person(10);
//此处调用的是构造方法 直接执行出age=10的结果
modify(p1);
System.out.println(p1);
你要想出age=20的结果 应该这样
public class testFromWeb01 {
public static void modify(Person p){ //使用此函数修改引用的指向
p = new Person(20);
System.out.println(p);
//修改在这里!!!!!
public static void main(String[] args) {
Person p1 = new Person(10);
modify(p1);
//修改p1引用的对象
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:随笔 - 130&
文章 - 1&评论 - 8&trackbacks - 0
  最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了。一下是文章(网摘)
1:按值传递是什么
指的是在方法调用时,传递的参数是按值的拷贝传递。示例如下:
public&class&TempTest&{&&
private&void&test1(int&a){&&
public&static&void&main(String[]&args)&{&&
TempTest&t&=&new&TempTest();&&
int&a&=&3;&&
t.test1(a);
按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。
示例如下:
public&class&TempTest&{&&
private&void&test1(int&a){&&
System.out.println("test1方法中的a="+a);&&
public&static&void&main(String[]&args)&{&&
TempTest&t&=&new&TempTest();&&
int&a&=&3;&&
t.test1(a);
System.out.println(&main方法中的a=&+a);&&
运行结果是:
test1方法中的a=5&&
main方法中的a=3&&
2:按引用传递是什么
指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
示例如下:
public&class&TempTest&{&&
private&void&test1(A&a){&&
public&static&void&main(String[]&args)&{&&
TempTest&t&=&new&TempTest();&&
A&a&=&new&A();&&
t.test1(a);&
class&A{&&
public&int&age&=&0;&&
3:按引用传递的重要特点
传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
示例如下:
public&class&TempTest&{&&
private&void&test1(A&a){&&
a.age&=&20;&&
System.out.println("test1方法中的age="+a.age);&&
public&static&void&main(String[]&args)&{&&
TempTest&t&=&new&TempTest();&&
A&a&=&new&A();&&
a.age&=&10;&&
t.test1(a);&&
System.out.println(&main方法中的age=&+a.age);&&
class&A{&&
public&int&age&=&0;&&
运行结果如下:
test1方法中的age=20&&
main方法中的age=20&&
4:理解按引用传递的过程&&内存分配示意图
要想正确理解按引用传递的过程,就必须学会理解内存分配的过程,内存分配示意图可以辅助我们去理解这个过程。
用上面的例子来进行分析:
(1):运行开始,运行第8行,创建了一个A的实例,内存分配示意如下:
(2):运行第9行,是修改A实例里面的age的值,运行后内存分配示意如下:
(3):运行第10行,是把main方法中的变量a所引用的内存空间地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。
内存分配示意如下:
由于是按引用传递,也就是传递的是内存空间的地址,所以传递完成后形成的新的内存示意图如下:
也就是说:是两个变量都指向同一个空间。
(4):运行第3行,为test1方法中的变量a指向的A实例的age进行赋值,完成后形成的新的内存示意图如下:
此时A实例的age值的变化是由test1方法引起的
(5):运行第4行,根据此时的内存示意图,输出test1方法中的age=20
(6):运行第11行,根据此时的内存示意图,输出main方法中的age=20
5:对上述例子的改变
理解了上面的例子,可能有人会问,那么能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面呢?
方法是在test1方法里面新new一个实例就可以了。改变成下面的例子,其中第3行为新加的:
&public&class&TempTest&{&&
&private&void&test1(A&a){&&
&a&=&new&A();
&a.age&=&20;&&
&System.out.println("test1方法中的age="+a.age);&&
&public&static&void&main(String[]&args)&{&&
&TempTest&t&=&new&TempTest();&&
&A&a&=&new&A();&&
&a.age&=&10;&&
&t.test1(a);&&
&System.out.println(&main方法中的age=&+a.age);&&
class&A{&&
&public&int&age&=&0;&&
运行结果为:
test1方法中的age=20&&
main方法中的age=10&&
为什么这次的运行结果和前面的例子不一样呢,还是使用内存示意图来理解一下
6:再次理解按引用传递
(1):运行开始,运行第9行,创建了一个A的实例,内存分配示意如下:
(2):运行第10行,是修改A实例里面的age的值,运行后内存分配示意如下:
(3):运行第11行,是把main方法中的变量a所引用的内存空间地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。
内存分配示意如下:
由于是按引用传递,也就是传递的是内存空间的地址,所以传递完成后形成的新的内存示意图如下:
也就是说:是两个变量都指向同一个空间。
(4):运行第3行,为test1方法中的变量a重新生成了新的A实例的,完成后形成的新的内存示意图如下:
(5):运行第4行,为test1方法中的变量a指向的新的A实例的age进行赋值,完成后形成的新的内存示意图如下:
注意:这个时候test1方法中的变量a的age被改变,而main方法中的是没有改变的。
(6):运行第5行,根据此时的内存示意图,输出test1方法中的age=20
(7):运行第12行,根据此时的内存示意图,输出main方法中的age=10
(1):&在Java里面参数传递都是按值传递&这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
(2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = &Java私塾&;
阅读(...) 评论()主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
傻丫头和高科技产物小心翼翼的初恋
个人大数据技术博客:
人生得意须尽欢,莫使金樽空对月。
一只文艺范的软件攻城狮,Keep Learn,Always.

我要回帖

更多关于 java 获取类属性和值 的文章

 

随机推荐