3. 对象与引用

231 阅读1分钟

据说这是java中最重要的东西,没有之一,哈哈。

public class Home {
    Cat cat;

    public static void main(String[] args) {
        Home home = new Home();
        Cat mimi =  new Cat();
        mimi.name = "咪咪";
        home.cat = mimi;
    }
}

像上面声明的home实例,他指向的是一个地址,地址指向的内存中存储着真正的内容。

改写一下代码,声明两只猫:

home.cat1 = mimi;
home.cat2 = mimi;

此时家中的两只猫是同一只猫吗?他们占据的是一个内存空间还是两个呢?答案是一个。因为cat1和cat2都被赋予了同一个地址值。由此引出了深拷贝和浅拷贝的问题。

public class Copy {
    public static void main(String[] args){
        Home home = new Home();
        Cat cat = new Cat();
        Home.cat = cat;
        cat.name = "咪咪";
        
        deepCopt(home);
    }
    
    public deepCopy(Home home){
        Home newHome = new Home();
        Cat newCat = new Cat();
        String newName = new String(home.cat.name);
        
        newCat.name = newName;
        newHome.cat = new Cat();
        
        return newHome();
    }
}

方法的传值,传引用

传值

public static void main(String[] args){
    int i = 0;
    addOne();
}

public int addOne(int i){
    i = i + 1;
}

在执行addOne后,main方法中的i仍然是0,这是因为在执行addOne方法时创建了一个新的执行环境,新的环境中将传递的实参赋值给了这个新的环境中,此时执行+1操作操作的时新环境中的变量,而不是main函数中的,并且函数执行完毕后整个环境会被销毁。

传引用

public static void main(String args){
    Cat cat = new Cat();
    cat.name = "老二";
    
    renameCat(cat);
}

static void renameCat(Cat cat){
    cat.name = "大傻子";
}

此时cat的name会被更改为大傻子,而不是老二。这是因为传递的是地址值,这个地址指向的内容被修改了,所以会体现在原来的类上面。