黑马程序员技术交流社区

标题: 对象传递所的方式问题 [打印本页]

作者: 胡文杰    时间: 2011-11-9 15:44
标题: 对象传递所的方式问题
当一个对象被当作参数传递到一个方法后,那么这个方法就可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 如:
class Person{
private String name;
public String getName() {
        return name;
}
public void setName(String name) {
        this.name = name;
}
public t
publci void Person(Person p){
System.out.println(p.getName());}
}

class PersonTest{
public static void main(String [] args){
Person f=new Person();
f.Person(new Person("efjlife"));
}

}
这个传递属于值传递还是引用传递呢?
作者: 喻尚健    时间: 2011-11-9 15:51
方法的参数传递机制只有一种:值传递,就是将实际参数值的副本(复制品)传入方法内,而参数本身不会受到任何影响。
作者: 郭学文    时间: 2011-11-9 15:51
本帖最后由 郭学文 于 2011-11-9 15:55 编辑

只要是对象就一定是传递引用
不是对象就是值了

你可以测试一下

int test(int x , int[] y)
{
y[0] =2;
return x=1;
}

只return  int x, 你测试一下 y其实不用Return也变了,所以是引用

你不Return Int X 你再看看


你慢慢测试,不用Return也改变的就是引用了




作者: 柴亚飞    时间: 2011-11-9 15:52
person 方法第一个字母应该是小写。大写看着让人别扭。
我知道答案是值传递。但不知道怎么区分值传递和引用传递。我也借楼主问一个问题,谁能具体解释一下什么叫引用传递?什么叫值传递?这两者有什么区别?
作者: 胡文杰    时间: 2011-11-9 15:57
风之末端 发表于 2011-11-9 15:51
方法的参数传递机制只有一种:值传递,就是将实际参数值的副本(复制品)传入方法内,而参数本身不会受到任 ...

意思只是一个值传递?实例化一个对象并把一个对象的值传递过去?!如果是这样我就理解了为什么是值传递!
作者: 史晓霞    时间: 2011-11-9 16:01
属于引用类型,值传递的结果不会改变,引用传递的结果会改变,值传递相当于一个相同的变量,存储到不同的内存中,一个值改变不会不会影响另一个变量的值,而引用传递,是指向同一个存储的对象,改变它的值,其他调用它的值也会改变,
作者: 海林    时间: 2011-11-9 16:02
你的程序有需要改写的地方,这样写编译都不能通过。
1 public t是什么?
2 f.Person(new Person("efjlife"));里面的传递的是String    你实际没有这样的构造方法
3 还有就是那个public void Person(Person){...} 这样的方法名有点别扭。容易混淆视听。
作者: 石宗银    时间: 2011-11-9 16:20
柴亚飞 发表于 2011-11-9 15:52
person 方法第一个字母应该是小写。大写看着让人别扭。
我知道答案是值传递。但不知道怎么区分值传递和引用 ...
  1. public class T1 {
  2.         private int age;
  3.         public static void main(String[] args) {
  4.                 System.out.println("----值传递----");
  5.                 int i = 0;
  6.                 get(i);//只是内部用了 一个值i的副本,
  7.                 System.out.println(i);//原i值不变
  8.                
  9.                 System.out.println("----引用传递----");
  10.                 T1 t1 = new T1();
  11.                 System.out.println(t1);
  12.                 T1 t2 = reference(t1);
  13.                 System.out.println(t2);
  14.                 System.out.println(t1==t2?"t1和t2是同个对象,只是改变了内部的属性值":
  15.                                 "t1和t2不是同个对象,改变了内部属性值,所以对象也变了");
  16.         }
  17.         static void get(int i) {
  18.                 i++;
  19.                 System.out.println(i);
  20.         }
  21.         static T1 reference(T1 t) {
  22.                 t.age = 18;
  23.                 return t;
  24.         }
  25.         public String toString() {
  26.                 return "age:"+this.age;
  27.         }
  28. }
复制代码

作者: 柴亚飞    时间: 2011-11-9 16:36
石宗银 发表于 2011-11-9 16:20

我现在不方便测试程序,你能把程序的结果输出让我看看吗?
作者: 海林    时间: 2011-11-9 16:38
----值传递----
1
0
----引用传递----
age:0
age:18
t1和t2是同个对象,只是改变了内部的属性值




我帮他传一下。
作者: 崔浩    时间: 2011-11-9 17:02
值传递就是复制一份,引用传递就是一个指针,地址,是同一个
作者: 胡文杰    时间: 2011-11-9 17:32
柴亚飞 发表于 2011-11-9 16:36
我现在不方便测试程序,你能把程序的结果输出让我看看吗?

输出结果是:efjlife




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2