美文网首页
JavaSE成神之路 - 我创建一个引用后赋值对象(必看)

JavaSE成神之路 - 我创建一个引用后赋值对象(必看)

作者: 剽悍一小兔 | 来源:发表于2023-03-13 09:17 被阅读0次

Hello,今天我们来学习Java的引用概念。
先回顾一下昨天的代码。

class Customer {}
class Vip {}
public class Demo {
   public static void main(String[] args){
        System.out.println("程序启动了...");
   }
}

其中有一句:

System.out.println("程序启动了...");

程序启动了...这几个字是用双引号括起来的,在Java中,用双引号括起来的部分叫做字符串,顾名思义,就是若干个字符组成的串串,叫做字符串。

当我们写"程序启动了..."的时候,就会开辟一块内存空间,保存这些数据。

字符串是一个对象,在java中,对象是存放在中的。也就是说,"程序启动了..."是存放在堆中的。

堆是Java用来存储对象数据的地方,我们直接写"程序启动了..."的时候,就会创建一个字符串对象。存放到Java堆中。

可以把堆理解为一家餐厅,里面有200张桌子,也就是最多能同时容纳200桌客人就餐,来一批客人就为他们安排一些桌子,如果某天来的客人特别多,超过200桌了,那就不能再接待超出的客人了。

当然,进来吃饭的客人不可能是同时的,有的早,有的晚,先吃好的客人,老板会安排给他们结账走人,然后空出来的桌子又能接待新的客人。

这里,堆就是餐厅,最大容量200桌就是堆内存的大小,老板就相当于GC(垃圾回收),给客人安排桌子就相当于java创建对象的时候分配堆内存,结账就相当于GC回收对象占用的空间。

有了这个初步认识,再来看官方的介绍:对于Java应用程序来说,Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java 世界里“几乎”所有的对象实例都在这里分配内存。

是不是就好理解多了呢?

我们需要一个引用

在之前的例子中,我们写"程序启动了..."的目的是得到一个字符串对象,但是这种写法是昙花一现的,只在

System.out.println("程序启动了...");

这行代码中一次生效,如果我们需要多次使用这个字符串,就没有办法。

没有办法就是没有办法,即便你写:

System.out.println("程序启动了...");
System.out.println("程序启动了...");

也是两个不同的字符串,不是多次使用同一个字符串的概念。

为了解决这个问题,我们需要一个引用。

什么是引用呢?如果java对象是一个电视机,那么引用就是遥控器,你只要有遥控器,就可以控制电视机开机关机,播放你想要看的节目。你拿着遥控器,相当于有了电视机。

而刚才的代码

System.out.println("程序启动了...");

相当于你抱着电视机,而不是拿起遥控器。

Java的引用,是需要和对象绑定起来讲的,比如我们可以这样写:

String s = "程序启动了...";

String是Java的一种类型class,s是变量名,当s等于一个具体的对象"程序启动了..."的时候,s就成为了一个引用

为什么呢,因为当运行到"程序启动了..."的时候,java会在堆中创建一个对象,堆是一块内存空间,参考上面的比喻就是桌子,桌子有编号,比如88号。所以String s = "程序启动了...";的意思就是我们把88号桌子分配给变量s,从此变量s就代表字符串对象"程序启动了..."

好了,下面有请两位杠精朋友登场。

杠精A:明白了,那我写String s;的时候,就是定义了引用s对吧?

答:谁跟你讲的?你直接写String s;,却没有对象赋值给它,它就不叫引用。它... ...它.. ....只是一个变量而已!(咋还急眼了)

杠精B:按照你的说法,如果我知道了内存中的地址,是不是直接赋值给它就行了,比如我写String s = 88;,也能指向那个字符串对象吧?

答:首先,88是一个数字,无法赋值给String类型的s。其次,这么理解是不对的,因为就算内存地址真的是88,直接写个内存地址也不能起到引用的效果啊,它就是个数字而已。(话说你这想法挺新奇的??)

"程序启动了..."这个对象创建后的返回值是一个引用,而s是一个变量,我们把一个引用赋值给变量s。那么,变量s也可以叫做对象的引用,因为它拥有了操控对象的权力。

好了,本节的目标就是把字符串赋值给引用。

class Customer {}
class Vip {}
public class Demo {
   public static void main(String[] args){
        String s = "程序启动了...";
        System.out.println(s);
   }
}

ctrl+1 编译

ctrl+2 运行

相关文章

  • Java核心编程笔记

    对象与对象变量 创建一个Date类对象 将刚刚创建的 birthday 对象赋值给 deadline 对象 局部变...

  • python赋值,浅拷贝,深拷贝

    1,赋值:不创建对象(对象的赋值都是进行对象引用(内存地址)传递),随原始数据改变而改变 2,浅拷贝:创建对象(不...

  • MyOwnWorld

    为什么需要先创建对象再使用对象? 因为只有new过后才能将类加载进堆中,堆中会对成员变量自动赋值,不赋值不能使用成...

  • 对象的复制赋值

    目录 潜复制&深复制 值传递&引用传递 可变对象&不可变对象 赋值 对象的赋值实际上是对象的引用。当创建一个对象,...

  • 十七、匿名对象

    匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量。创建一个匿名对象: new Pers...

  • python直接赋值、深拷贝和浅拷贝

    python中,对象赋值实际上是对象的引用。当创建一个对象,将其赋值给另一个变量,python并没有拷贝这个对象,...

  • 类和对象

    创建一个类 创建对象 new 类名();就是实例化,然后创建一个类的对象。对象.变量就是赋值。 局部变量和成员变量...

  • 常用的对象字面量的增强写法

    对象的增强写法: 以前创建对象的写法:通过new一个对象实例。 现在创建对象直接用{ }赋值,这种写法很常见,那什...

  • Python3 & 浅拷贝与深拷贝

    在Python中对象的赋值(=)其实就是对象的引用。即:当创建一个对象,把它赋值给另一个变量时,python并没有...

  • Java工程师该如何编写高效代码?

    1.常量&变量 1.1.直接赋值常量值,禁止声明新对象 直接赋值常量值,只是创建了一个对象引用,而这个对象引用指向...

网友评论

      本文标题:JavaSE成神之路 - 我创建一个引用后赋值对象(必看)

      本文链接:https://www.haomeiwen.com/subject/pstzldtx.html