Java基本概念之传递和引用
in Java with 0 comment
Read: 469

Java基本概念之传递和引用

in Java with 0 comment

传值与引用

不管Java参数的类型是什么,一律传递的是参数的副本 (来自:《Java程序员面试宝典》)
如果Java是传值,那么传递的是值的副本;如果Java是传引用,那么传递的是引用的副本(来自:《Thinking in java》)

在Java中,变量分为两类:基本数据类型和引用数据类型

对于传递引用的副本,可以这么理解:
一个仓库,有一把钥匙,负责人A持有,那么有一天,负责人A不在家,B恰好要来调研,那么A就事先复制了一把钥匙寄给了B,那么B就可以对仓库进行操作了,但是B使用完要上交,所以B使用的钥匙有时效性

Example Ⅰ

    public static void main(String[] args) {

        boolean test = true;

        System.out.println("Before test(boolean) : test " + test);

        test(test);

        System.out.println("After test(boolean) : " + test);
    }

    public static void test(boolean test) {
        test = !test;
        System.out.println("In Test(boolean) : test = " + test);
    }

    //Before test(boolean) : test true
    //In Test(boolean) : test = false
    //After test(boolean) : true

当我们把值传到test方法中,实际上是传入的一个副本,当我们方法结束后,这个副本被销毁,所以我们的main方法的值不变

Example Ⅱ

    public static void main(String[] args) {
        StringBuffer string = new StringBuffer("Hello");
        test(string);
        System.out.println(string);

    }

    public static void test(StringBuffer str){
        str.append(", World !");
    }
    
    //Hello, World !

在这里,String是一个引用,Java对于引用形式传递对象类型的变量时,实际上是将引用作为一个副本传进方法函数的,这个副本指向的是对象的地址。通过引用副本(复制的钥匙)找到地址(仓库)并修改地址的值,也就修改了对象

Example Ⅲ

    public static void main(String[] args) {
       String string = "Hello";
       test(string);
       System.out.println(string);

    }

    public static void test(String str) {
        str = "World";
    }

    //Hello

为什么还是Hello,因为执行了str="World"的时候,其过程为:首先系统会自动生成一个新的String对象,并把这个新对象的值设为World,然后把对象的引用赋值给str,但是,在这里我们要知道String是fina类型的,因此你不可以继承和修改这个类,str="World",其实就是隐含的让java生成了一个新的String对象

而第二个例子中:StringBuffer是产生一个内存空间,相关的增、删、改操作都在其中进行,所以添加的值是在同一个内存地址中进行的


输入/输出流

Example Ⅰ

请给出一段代码描述字符串写入文件

    public static void main(String [] args){
        try {
            FileOutputStream out = new FileOutputStream("FileName.txt");
            out.write("字符串写入文件".getBytes());
            out.close();
        }catch (IOException ioe){
            ioe.printStackTrace();
        }
    }

Example Ⅱ

写一个Java程序,从键盘输入两个整数,然后输出它们的平方值及立方值

 public static void main(String[] args) {
        Result result = new Result();
        System.out.println("请输入一个整数");
        int a = InputData.getInt();
        result.print(a);
    }
}


class InputData {
    static private String s = "";

    /**
     * 从键盘输入一个字符,保存到字符串s中
     */
    static public void input() {
        BufferedReader bu = new BufferedReader(
                new InputStreamReader(System.in)
        );

        try {
            s = bu.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    static public int getInt() {
        input();
        return Integer.parseInt(s);
    }

}

class Result {
    void print(int d) {
        System.out.println(d + "的平方:" + d * d);
        System.out.println(d + "的立方:" + d * d * d);
    }

Example Ⅲ

Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式

面向字节的操作以8位为单位对二进制进行数据操作,对数据不转换,这类都是InputStream和OutputStream

面向字符的操作以字符为单位对数据进行操作,在读的时候将二进制转换为字符,在写的时候将字符转换为二进制数据,这些都是以Reader和Writer为子类

总结:

Responses