Java 基础教程

值传递

Java 语言中进行赋值操作、方法调用传参时,均遵循值传递的原则,即传递的永远是参数的值。

基本数据类型的参数传递,传递的是参数中保存的真实值,而不是引用。

引用数据类型参数传递,则是传递的是对象的引用,而非对象的全部数据(这是因为对象实际被保存到堆栈中,变量或参数中仅仅是保存对象在堆栈中的地址,即引用)。正因为如此,有可能会出现多个引用类型变量指向同一个对象的情况。

实例:演示基本数据类型和引用类型值传递

public class Demo {

    public static void main(String[] args) {
        Demo demo = new Demo();
        // 这里传递的 100 和 Tom 均是值传递
        User user = demo.createUser(100, "Tom");
        // 这里传递的 user 属于引用传递
        demo.showUser(user);
    }

    private User createUser(int id, String name) {
        User user = new User();
        user.setId(id);
        user.setName(name);
        return user;
    }

    private void showUser(User user) {
        System.out.println("User ==> id=" + user.getId() + ", name=" + user.getName());
    }

}

class User {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

运行实例,输出结果如下:

User ==> id=100, name=Tom

当程序执行到 demo.showUser(user); 语句前,内存状态如下图:

其中:

  • id 是基础数据类型,因此值直接保存到堆栈。

  • name 是一个字符串,Java 中字符串比较特殊,字符串实际值被保存到堆内存的字符串常量池,因此 name 变量保存的是字符串在堆内存中的地址(0x435527A7)。

  • user 变量是一个引用类型变量,保存的是 User 对象在堆内存的内存地址(0x435527A8)。

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号