码迷,mamicode.com
首页 > 其他好文 > 详细

一月十九日星期一

时间:2015-01-20 00:50:15      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

今天看研究了下java的参数调用问题,花费了好长时间.有时候简单的问题不是想想就当自己懂了的,还是得通过demo来验证.晚上看完了corejava上讲继承的章节,明天敲几个demo巩固巩固.最近在用一款doit.im的任务管理app,前一天晚上或者一早起来安排一下一天的任务,晚上检查完成情况.

/*
 * java中的参数传递:按值调用.基本类型传递数值,引用类型传递地址值
 * 方法参数使用情况:
 *     一个方法不能修改一个基本数据类型的参数,int change
 *     一个方法可以改变一个对象参数的状态,buffer change
 *     一个方法不能让对象参数引用一个新的对象,buffer swap
 */
public class CallbyTest {
    public static void main(String[] args) {
        int x = 2;
        int y = 3;
        System.out.println("before:  " + x + "......." + y);
        change(x, y);//
        System.out.println("after:   " + x + "......." + y);
        System.out.println("---------------------------------------");
        String s1 = "aaa";
        String s2 = "bbb";
        System.out.println("before:  " + s1 + "......." + s2);
        change(s1, s2);// String类是不可变的,只是改变了参数引用,而没有改变参数对象的状态
//        swap(s1,s2);
        System.out.println("after:   " + s1 + "......." + s2);// 虽然传递的是地址值,change方法里b的引用改变了
        System.out.println("---------------------------------------");
        // String s11 = new String("aaa");//这段表明了String类无论哪种定义方式传递的仍为地址值
        // String s22 = new String("aaa");//new方式传递String对象地址值
        // String s11 = "aaa";//""方式传递字符串常量地址值
        // String s22 = "bbb";
        // System.out.println("before:  " + s11 + "......." + s22);
        // swap(s11, s22);
        // System.out.println("after:   " + s11 + "......." + s22);
        // System.out.println("---------------------------------------");
        StringBuffer sb1 = new StringBuffer("aaa");
        StringBuffer sb2 = new StringBuffer("bbb");
        System.out.println("before:  " + sb1 + "......." + sb2);
        change(sb1, sb2);// 引用值传递,改变了引用对象的状态
        System.out.println("after:   " + sb1 + "......." + sb2);
        System.out.println("---------------------------------------");
        StringBuffer sb3 = new StringBuffer("aaa");
        StringBuffer sb4 = new StringBuffer("bbb");
        System.out.println("before:  " + sb3 + "......." + sb4);
        swap(sb3, sb4);// 获得两个对象引用的拷贝,该方法交换的也是这两个对象的拷贝.
        System.out.println("after:   " + sb3 + "......." + sb4);
    }

    public static void change(int a, int b) {
        a = b;
        b = b + 3;
        System.out.println("int change a:" + a + ‘\t‘ + "int change b:" + b);
    }

    public static void change(String a, String b) {
        a = b;// 字符串变量引用字符串常量"bbb"的地址值
        b = a + b;// String类不可更改,创建新的字符串常量"bbbbbb",并将其地址值赋给字符串变量b
        System.out.println("string change a:" + a + ‘\t‘ + "string change b:"
                + b);// 这里a仍为"bbb"证明了引用的是字符串常量
    }

    public static void change(StringBuffer a, StringBuffer b) {
        a = b;// 按值传递
        System.out.println("before append b:   " + a);// 此时b未改变
        b.append(a);// b引用的对象状态放生改变
        System.out.println("buffer change a:" + a + ‘\t‘ + "buffer change b:"
                + b);// b改变了,a引用的b地址值,故这里显示a为b改变后的
    }

    public static void swap(StringBuffer a, StringBuffer b) {
        StringBuffer temp = null;
        temp = a;
        a = b;
        b = temp;
        System.out.println("buffer swap a:" + a + ‘\t‘ + "buffer swap b:" + b);
    }

    public static void swap(String a, String b) {
        String temp = null;
        temp = a;
        a = b;
        b = temp;
        System.out.println("string swap a:" + a + ‘\t‘ + "string swap b:" + b);
    }
}

一月十九日星期一

标签:

原文地址:http://www.cnblogs.com/zsy0917/p/4235064.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!