精华内容
下载资源
问答
  • Java值传递

    2021-04-24 22:05:41
    Java值传递

    Java值传递

    Java方法中参数的使用是通过值传递完成的
    值传递就是拷贝传递,将实参的值传递给形参,方法改变的是形参的值,而不会改变实参的值

    public static void main(String[] args) {
    	int num=1;
    	add(num);
    	System.out.println("实参的值为"+num);
    	}
    	
    	static void add(int num)
    	{
    		num=num+1;
    		System.out.println("形参的值为"+num);
    	}
    

    运行结果:
    运行结果
    可见方法并没有改变实参的值,仅仅改变了形参的值,所以值传递是一种拷贝传递,即将实参的值拷贝一份传递给形参

    展开全文
  • java值传递

    2017-09-24 21:46:52
    java值传递接触java也有一段日子了,说来惭愧,最近才想起要看下java的参数传递情况,也是一个困扰了我一段日子的问题。 要搞清楚java的值传递,首先要分清楚什么是引用和对象。 例如下面的例子Person person=new ...

    java值传递

    接触java也有一段日子了,说来惭愧,最近才想起要看下java的参数传递情况,也是一个困扰了我一段日子的问题。

    • 要搞清楚java的值传递,首先要分清楚什么是引用和对象。
    • 例如下面的例子Person person=new Person();
    • 当我们声明了Person person过后能不能直接拿来用呢,答案是否定的,肯定是不可以的,只有在为其申请了地址空间过后才能使用,Person person就是一个引用,new person就是一个对象,一个对象可以指向很多个引用,但是一个引用只能有一个对象。
    • 例如String string=new String(“123”);
    • 当我们再次对其赋值String string =new String(“234”);
    • 会发现它的值变成了234。
    • 这时候我们可以String newString =sting.
    • 将他的对象再赋值给newString。

    回来说到java的值传递

    java中方法参数传递方式是按值传递。
    如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
    如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。
    不难理解,比如我们传入int值过后,不论代码里面怎么改变,都不会改变原来的值,但是当我们写出如下的代码

     StringBuffer string =new StringBuffer("123");
     setString(string);
    
        public void setString(StringBuffer s){
            s.append("123");
        }

    会惊讶的发现string的值变成了123123,回到这句话,传递的是该参量所引用的对象在堆中地址值的拷贝。也就是说,当我们运行该函数的时候,将会复制一个StringBuffer对象,他的引用指向string ,所以当我们改变了s的值的时候,由于他们共享一个对象,所以 string的值也会改变。

    StringBuffer string =new StringBuffer("123");
    setString(string);
        public void setString(StringBuffer s){
            s=new StringBuffer("234");
        }

    同理,上面的例子,为什么s的值不会改变,因为s是string的拷贝,当重新为他分配引用过后,他就会指向一个全新的对象,所以,原来的值肯定不会改变的。

    如果有任何问题欢迎指正。

    展开全文
  • java 值传递

    2015-11-05 14:08:54
    java 值传递java只有值传递,没有引用传递 值传递,传递的是参数的副本一:参数是基本类型 传递的是实参的的副本,也就是实参的值,方法内对值修改,不会改变原始参数的值二:参数是引用类型 如果类型是引用...

    java只有值传递,没有引用传递
    值传递,传递的是参数的副本,对副本的修改不会影响原对象

    一:参数是基本类型
    传递的是实参的的副本,也就是实参的值,方法内对值修改,不会改变原始参数的值

    二:参数是引用类型
    如果类型是引用类型,则传递的是引用的副本(实际上就是传递引用地址),这个副本里存放的是参数地址,它和实参的引用指向同一个对象。

    1: 如果在方法内没有改变这个副本的地址,改变了副本地址指向对象的值,则函数内的修改会影响实参的值(因为实参和副本指向同一对象)

    2: 如果在方法内改变了副本的地址(如:new 一个新对象且副本指向它),则函数内修改不会影响实参,因为实参地址没有变,还是指向原来的对象

    public class PassTest {
        public static void m1(int a_int) {
            a_int = 20;
        }
        public static void m2(Person p) {
            p = new Person(3,"ccc");
        }
        public static void m3(Person p) {
            p.setTname("ddd");
        }
    
       public static void main(String[] args) {
            int a_int = 10;
            Person p1 = new Person(1,"aaa");
            Person p2 = new Person(2,"bbb");
            m1(a_int);    //值传递
            m2(p1);       //引用传递
            m3(p2);       //引用传递
    
        System.out.println(a_int);
        System.out.println(p1.getTname());
        System.out.println(p2.getTname());
        }
    }
    
    class Person {
        private int tid;
        private String tname;
        public Person(int tid, String tname) {
            super();
            this.tid = tid;
            this.tname = tname;
        }
        public int getTid() {
            return tid;
        }
        public void setTid(int tid) {
            this.tid = tid;
        }
        public String getTname() {
            return tname;
        }
        public void setTname(String tname) {
            this.tname = tname;
        }
    }

    输出:
    10
    aaa
    ddd

    展开全文
  • Java 值传递

    2014-05-12 21:34:39
    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答案基本上是:值传递 说明:得出这种结论的前提必须是“参数的值就是对该对象的...

    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  

    答案基本上是:值传递

    说明:得出这种结论的前提必须是参数的值就是对该对象的引用,而不是对象的内容” 

    ----------------------------------------------------

    值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法中执行形式参数值的改变不影响实际参数的值。

    引用传递:也称为传地址。方法调用时,实际参数的引用(即地址,而不是参数的值)被传递给方法中相对应的形式参数,

    在方法中执行对形式参数的操作实际上就是对实际参数的操作(地址操作),这样方法执行中形式参数值的改变将会影响实际参数的值。

     

    1.      基本类型传递

    基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的, 值都存在栈中。

    public class Other {

            public static void main(String[] args) {

                         int a = 1;

                         method(a);

                         System.out.println(a);

                      

            }

     

            public static void method( int a){

                 a = 2;

            }

    }

    输出: a = 1;

    2.      类传递

    Case 1:

    public class Other {

            public static void main(String[] args) {

                StringBuffer s = new StringBuffer("abc");

                method(s);

                System.out.println(s);          

            }

            public static void method(StringBuffer s){

                 s = new StringBuffer("abc");

                 s.append("d");

            }

    }

    输出:abc

    解析:这时传递的是对象的地址,方法中的s又重新创建了对象“abc”,这时他们引用两个不同堆内存。s.append是在method创建出的“abc”上加“d”,所以会main中不会变。

     

    Case 2:

    public class Other {

            public static void main(String[] args) {

                 StringBuffer a = new StringBuffer(“abc”);

                 method(a);

                 System.out.println(a);

            }

            public static void method( StringBuffer a){

                 a.append(“d”);

            }

    }

    输出:abcd

    解析:这时传递的是对象的地址,方法中的s同样指向 mains的指向“abc”, s.append是将“abc”加上“d,method直接修改这个值,所以会main中也跟着变。

     

    Case 3:

    public class Other {

            public static void main(String[] args) {

                        

                         String s = new String("abc");

                         method(s);

                         System.out.println(s);

                        

            }

     

            public static void method(String s){

                 s = s+"d";

            }

    }

    输出:abc

    在方法中改变String值,我画出的图如下:


    因为在a的值是个地址。所以传的值也就是0x0001,然后方法中的a也指向堆内存的“aaa”。当a=bbb”时,方法区中的a 指向0x0002所以main中的a 还是不变的。与case2不同的是String是不可变的,s+”d”是将存有abc的字符数组的值取出再加上d. 总之一定不是在原有的“aaa”上进行操作,这牵扯到String的安全性设计。

    3.      数组传递

    public class Other {

     

        public static void main(String[] args) {

            int[] a = new int[] { 1, 2 };

            method(a);

            System.out.println(a[0]);

        }

     

        public static void method(int[] a) {

            a[0] = 0;

        }

    }

    输出:2

    数值为什么会改变呢,我画了如下的堆栈图。

     

    因为数组的地址和数组中值的地址中间又多了一道。传递到Method的b是main中b的值,也就是数组在堆中的地址0x0003,然后在这个数组中,第一个值又指向堆中的数值1,也就是0x0004 这时method 做b[0]=0,也就是把 数组中的第一位由0x0004改成0x0006,直接操作了该数组。

    展开全文
  • Java值传递和引用传递1 什么是Java值传递和引用传递在Java中只有值传递,而没有引用调用。如果我们调用传递值的方法,则称为按值调用。在调用方法中完成的更改在调用方法时不受影响。2 Java值传递-原始类型如果值...
  • JAVA值传递

    2011-09-26 15:55:06
    我不记得自己是怎么学到的,但是我相信绝大...在Java中方法参数的传递,对象是传递引用,基本数据类型是传递值。而且一直一来都似乎没有人提出过疑问。 直到最近,我在为公司基本Java开发人员编写考试试卷的时候,
  • java值传递 引用值传递
  • 也许你有听说过这个java只有值传递,那么这样说的原因是什么呢?什么是值传递?什么又是引用传递?下面一起来了解一下吧。对于这个问题,不一样的人会存在着不同的理解,对初始java的人来说,可能会简单的认为,java...
  • 主要介绍了 Java 值传递和引用传递详解及实例代码的相关资料,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,597
精华内容 6,238
关键字:

java值传递

java 订阅