信息发布软件,b2b软件,广告发布软件

标题: Java传递引用类型的实质和多方法实例教程 [打印本页]

作者: 宣传工具    时间: 2016-9-27 14:24
标题: Java传递引用类型的实质和多方法实例教程
首先看java代码如下:

import java.util.Scanner;

import org.junit.Test;

public class TestCoreJava {

@Test

public void testString() {

String original = "原来的值";

modifyA(original);

System.out.println(original);

StringBuffer sb = new StringBuffer();

sb.append(original);

modifyObject(sb);

System.out.println(sb.toString());

}

public void modifyA(String b) {

b = "改变的值";

}

public void modifyObject(StringBuffer object ) {

String b = "改变的值";

StringBuffer sb1 = new StringBuffer();

sb1.append(b);

//object.append(b); 在object指向的引用没改变之前,调用append方法对其指向的堆内存中内容进行修改,是可以达到修改原始StringBuffer对象sb的存放内容这个目的的。

object = sb1;

}

}

  说明:除开八种基本类型之外,在java中其余类型都是引用类型,包括String也是引用类型,传递的也是引用。

我原以为,既然传递的是引用,那么String对象original交由方法modifyA处理后,original存放的值应该变为“改变的值”

同样StringBuffer对象sb存放的值也应该改变成“改变的值”,但是结果却没有,输出都为“原来的值”,然后我就怀疑是否他们传递的不是引用

原来:modifyA(String b)方法在被调用时,original传递给该方法,该法是创建了一个新的String对象b,它也将引用指向original对象指向的那块

堆内存。而我在modifyA方法中使用语句:b = "改变的值";该语句并不能够到达改变original对象的目的,他紧紧将b对象的引用地址改为指向“改变的值”

这个对象所在的堆内存。所以original对象还是指向原来的堆内存,当然他的输出结果不变,同样的问题对StringBuffer对象sb也存在。

  所以可以看出,没有到达期望结果的原因是使用“=”赋值运算符,他修改了副本对象(被调用方法自己创建的中间对象,比如modifyA方法创建的b)的引用地址,

使他指向了不同的堆内存(这对原始的对象内容是没有影响的),而没有实际修改他指向的堆内存中具体值导致的意外。

所以 modifyObject方法中那条被注释语句可以达到修改原始内容的目的.



作者: 宣传工具    时间: 2016-9-27 14:26
实例教程2

加深对基本类型和引用类型的理解;
【效果图】 Java传递引用类型的实质和多方法实例教程 b2b软件
【分析】
【代码】 public void test() throws Exception {
        System.out.println("\nint:=================");
        int i = 2;
        System.out.println("before:" + i);
        change1(i);
        System.out.println("after:" + i);

        System.out.println("\nInteger:=================");
        Integer integer = 3;
        System.out.println("before:" + integer);
        change2(integer);
        System.out.println("after:" + integer);

        System.out.println("\nString:=================");
        String str = new String("xxx");
        System.out.println("before:" + str);
        change3(str);
        System.out.println("after:" + str);


        System.out.println("\nString[]:=================");
        String[] array = new String[]{"a", "b", "c"};
        System.out.println("before:" + array[0]);
        change4(array);
        System.out.println("after:" + array[0]);

        System.out.println("\nBook:=================");
        Book book = new Book("book1");
        System.out.println("before:" + book.name);
        change5(book);
        System.out.println("after:" + book.name);

        System.out.println("\nint[]:=================");
        int[] int_array = new int[]{1, 2, 3};
        System.out.println("before:" + int_array[0]);
        change6(int_array);
        System.out.println("after:" + int_array[0]);
    }


    public void change1(int i) {
        i = 4;
    }

    public void change2(Integer integer) {
        integer = (Integer) 8;
    }

    public void change3(String str) {
        str = new String("yyy");
    }

    private void change4(String[] array) {
        array[0 = "A";
    }

    private void change5(Book book) {
        book.name = "book2";
    }

    private void change6(int[] int_array) {
        int_array[0 = 10;
    }

    private class Book {
        public String name;

        Book(String name) {
            this.name = name;
        }
    }

【参考资料】





欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://www.postbbs.com/) Powered by Discuz! X3.2