zoukankan      html  css  js  c++  java
  • 小白都能看得懂的Java赋值和引用

    • 什么是赋值?什么是引用?

      ​ 赋值使用的操作符=,意思是指将右边的值复制给左边,右边可以是任何常数、变量或者表达式(只要它能生成一个值),左边必须是明确的已命名的变量。如果右边是基本数据类型,则直接将值赋值给左边,即赋值;如果右边是一个对象,则是将对象的引用赋值给左边,即引用,其实两者之间并没有差别,在于我们怎么去理解。

    • 基本数据类型的赋值

    public static void main(String[] args) {
      int x = 99;
      int y = 88;
      System.out.println("--1> x: " + x + ", y: " + y);
    
      x = y;
      System.out.println("--2> x: " + x + ", y: " + y);
    
      x = 101;
      System.out.println("--3> x: " + x + ", y: " + y);
    }
    
    /* 打印的值为 */
    --1> x: 99, y: 88
    --2> x: 88, y: 88
    --3> x: 101, y: 88

      ​ 以上代码块的意思很好理解,基本数据类型存储了实际的数值,并非是指向一个对象的引用。

    ​ 如上所示,x = y,那么y的内容就复制给x,然后修改了x的值,并不会影响y的值。

    • 对象的“赋值”,即引用
    /**
     * Book类,书本
     */
    public class Book {
    
          /* 页码数 */
        private int pages;
    
        public int getPages() {
            return pages;
        }
    
        public void setPages(int pages) {
            this.pages = pages;
        }
    }
    
    /**
     * Book测试类
     */
    public class BookTest {
    
        public static void main(String[] args) {
            Book b1 = new Book();
            Book b2 = new Book();
    
            b1.setPages(9);
            b2.setPages(23);
    
            System.out.println("1> b1.pages: " + b1.getPages() + ", b2.pages: " + b2.getPages());
    
            b1 = b2;
            System.out.println("2> b1.pages: " + b1.getPages() + ", b2.pages: " + b2.getPages());
    
            b1.setPages(48);
            System.out.println("3> b1.pages: " + b1.getPages() + ", b2.pages: " + b2.getPages());
        }
    }
    
    
    /* 打印的值为 */
    --1> b1.pages: 9, b2.pages: 23
    --2> b1.pages: 23, b2.pages: 23
    --3> b1.pages: 48, b2.pages: 48

      以上代码块,描述的意思是有一个Book类,Book有一个字段为页码数pages;创建了两个对象book1和book2,分别为两个对象设置了不同的页码数,在打印第二行代码时,我们还没有任何疑问,但是在打印第三行代码的时候,产生了疑问,明明只是设置了b1的页码数,但是为什么打印出来的b2的值也改变了呢,这是因为在为对象“赋值”的时候,我们真正操作的是对象的引用。

    Book b1 = new Book();

    Book代表的是类,b1代表的是引用,b1不是对象,new Book()才是对象,b1引用指向new Book()这个对象。

    初始化对象的时,b1和b2指向的两个不同的对象,互不影响,如下图

    在将b2“赋值”给b1时,此时是将b2的引用赋值给了b1,b1和b2同时指向了b2这个对象,故下图b1 = b2;

    至此,大家可以回看上面对象引用的代码,应该完全可以明白上面代码的意思了。

    • 方法调用对象传递时,也会产生上面类似的效果。

      

    public static void main(String[] args) {
    
      Book book = new Book();
    
      book.setPages(200);
    
      System.out.println("--1> book.pages: " + book.getPages());
    
      set(book);
      System.out.println("--2> book.pages: " + book.getPages());
    }
    
    static void set(Book b) {
      b.setPages(99);
    }
    
    
    /* 打印的值为 */
    --1> book.pages: 200
    --2> book.pages: 99

    ​   上述代码中,方法set(),看似是在它的作用域内复制其参数Book b的一个副本,实际上只是传递了一个引用,所以set()方法改变的是set()之外的对象。

    请扫码关注下方微信公众号

    扫码关注微信公众号

  • 相关阅读:
    7、【Linux系统编程】阻塞和非阻塞
    css样式
    如果目录不存在就创建
    api图片传输,转成64位字符串进行传输
    c#获取远程图片的方法
    分页
    使用微信js接口的方法 ,以调用相机为例
    某个文件下下面的文件批量改名
    查找本地文件中的特定字符串并替换代码
    第35月第6天 自定义view初始化
  • 原文地址:https://www.cnblogs.com/xxss/p/12714411.html
Copyright © 2011-2022 走看看