A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

下面这段代码,定义了一个Person类,该类有个成员变量name,对该变量有get,set方法
GG类主函数当中创建了一个Person对象,该类有两个静态方法,一个方法有Int型参数,一个方法有Person型参数
我的问题是:
当把x传给函数,改变x的值,再回来打印时,x值无变化
当把对象传给函数,改变对象的成员变量,再回来打印该成员变量值时,该成员变量值以经改变
为什么,对象和变量会有两种不同的待遇(对象的成员变量改变,而整形变量x却没有改变)。。。。。。。。。
class Person
{
        private String name;

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }
}
public class GG {

        public static void main(String[] args)
        {
                Person p = new Person();
                int x =0;
                System.out.println("调用方法前x:"+x);
                System.out.println("调用方法前p.getName():"+p.getName());
                changeInt(x);//把x传给该函数,改变x的值
                changePerson(p);//把对象的引用传给该值,改变对象的成员变量
                System.out.println("调用方法后x:"+x);
                System.out.println("调用方法后p.getName():"+p.getName());
        }
        public static void changeInt(int x)
        {
                x = 1;
        }
        public static void changePerson(Person p)
        {
                p.setName("haha");
        }
}


评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
那个x是局部变量  你只改了局部x的值, 这里传x进来其实只传了表面值。把外面x的值给予里面x。
person p 也是局部变量,你把对象的引用(地址值)传进来了,这里的变量p也就指向对象P的堆空间了,方法内用setName()更改对象p的name属性。

学了c的指针知识会清楚一些

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
两个问题  1  假如 public static void changeInt(int x)  方法的 参数时 y  那的操作只是把x的值0  赋值给了 y  对于x没有任何改变。
              2  changePerson方法中你把  对象的地址值传递给了  p  那两个p指向了堆中的同一个对象  所以第二个p对对象的修改  第一个也能获取到
回复 使用道具 举报
x将值传递给changeInt()之后,改变的仅仅是在方法去中的那个x的值,主函数内部的x并没有改变。
而person是在主函数内部new了一个对象,也就是说这时,peron p指向了对象,p将存放数据的地址传递给了changePerson(),所以改变对象成员变量的值,主函数内部的x也会改变
回复 使用道具 举报
首先呢,java中的参数传递分为两种,即值传递和引用传递,请看下面:
(1)值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。(形参值的变化不会影响实参值)(2)引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。(形参值的变化会影响实参值)

对于基本类型的参数,java虚拟机所做的工作是将参数的值拷贝一份,然后将拷贝的值传递到方法的内部,作为局部变量。

     我们回去看看上面的程序:
      public void changeInt(int i){
  i = 1;
      }
当方法调用的时候,但是他们是不同的变量,i是change()中的局部变量。change()结束后,i的生命周期结束会被销毁。而name是Person的一个属性,也是个全局变量,因而对i的改变不会影响name的值。结合上面值传递的定义,可以看出此处的传递是值传递。这里的参数是基本类型的,也就是说基本类型参数的传递是值传递。

如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。



回复 使用道具 举报
{:soso_e183:}  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马