java语法的模糊

java语法的模糊

代码运行提交正确了,但在自己编写程序时,对于 Node == null  产生了疑惑

这里的Node就是一个结点变量,如果理解java语法正确的话,Node它只是一个自己设计的结点类型的变量,他是指向一个结点空间的,也就是我们new的那一块。

我的疑问是,那么这个Node只是实例的类对象,Node == null ,这说明什么呢?是Node没有指向任何一个实际的结点吗,就相当于只是 private ListNode Node;  单纯实例化一个类对象变量(我表述的可能不准确),没有创建一个真实的结点空间。

):把问题写出来,一步步理,好像就想通了


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

我不确定你是不是有 C/C++ 的基础,如果有的话,可能就会清晰很多。


用 C/C++ 的语言说,就是 Java 中的所有(注意是所有)类对象,本质其实都是一个指针。但是,在 Java 中叫引用。所以,所有的类对象,都可以指向空,当然,也可以指向一个具体的类对象。


如果你没有 C/C++ 的基础,就不用管上面我说的“指针”的概念了,直接使用下面的理解。


=========


如果从内存的角度看,new 操作真正创造了承载实体变量的内存空间,并且初始化了这个内存空间。所以你可以看到,所有的类对象,在创建的时候,都是 X x = new X() 的样子。其本质是,让 x 这个变量,指向了 new 出来的内存地址。否则的话,x 没有指向任何内存地址,就是空。


注意,我说的是所有“类对象”。但是对于基本数据类型,不需要 new。比如我们直接写 int a = 5 就可以。而不用 new。为什么,因为 int 是基本数据类型。此时,a 存储的是值,而非引用(址)。


区分值和址,是计算机专业学习任何语言都会接触,并且是非常重要的一个概念。有些语言这个概念在具体层面上会比较复杂(C/C++ 就比较复杂。)有些语言相对简单很多。Java 其实就简单很多。因为除了基本数据类型,其他的都是引用(址)。


Java 的基本数据类型就 8 个。

  • 整数类型:byte,short,int,long.

  • 浮点数类型:float,double.

  • 字符类型:char.

  • 布尔类型:boolean.


除了这把基本类型的变量,你看到的所有的变量,都是指向一个内存空间,这个内存空间才真正存储了“内容”,变量名称只是为了获取这些内容的一个“箭头”(地址)而已。箭头可以指向空。


我不确定我这样解释你是否能理解。但很有可能,从概念层面你理解了,但是,在具体编程中,你还会因为对这个概念理解的不够深刻,而犯一些错误。这是很正常的。当饭这些错误的时候,我们可以再修改这些错误的时候,回过头再来体会这个概念,对这个概念的理解就会越来越深刻。这就是学习的过程:)


继续加油!:)

  • 懒洋洋爱学习 提问者 #1
    老师,我其实有些C的基础,对指针有些了解
    问题:prev.next = new Node(e,prev.next);

    这里突然看不懂了!等号左边的都可以理解,它是指向结点的,prev.next就是给prev目前所指向的结点的后一个结点,重新定义挂接。但是这个等式右边是new了一个结点空间,里面存了值e,第二个参数放的是

    next : prev.next? 这里不太明白了,我认为的new里面初始的next是创建的当前结点中指向的下一个结点(1.这个理解对吗?),这样的话new的新结点后面挂接的/指向的是prev.next,但是它还让prev.next.......我已经乱了,

    再理理prev.next = 就是让prev所指向的结点的next指向等号右边新创建的结点,但我上面认为的new的结点中next是指向prev.next的,这里就有点蒙了

    很多语言上表达不准确,老师可以直接批评指正

    2022-08-29 23:06:19
  • liuyubobobo 回复 提问者 懒洋洋爱学习 #2

    复杂的代码看不懂,就把他们拆解开。


    这个代码等价于:

    Node node = new Node(e, prev.next);
    prev.next = node;


    而 new Node 的逻辑执行的 https://git.imooc.com/class-105/Play-Algorithms-and-Data-Structures/src/master/07-Linked-List/02-Add-Elements-in-LinkedList/src/LinkedList.java 8,9 行的逻辑,也就是为新建立的 Node 相应的 e 和 next 赋值而已。你也可以再把他拆解开:


    // A
    Node node = new Node(); // 先创建一个节点,但是 e 和 next 都为空
    node.e = e;
    node.next = prev.next; // 这个新创建的节点的 next,和 prev.next 指向是一样的。
    // 上面这三行,等价于 Node node = new Node(e, prev.next);
    
    // B
    prev.next = node; // 改变 prev 的 next,指向新建的 node


    这就是这一句代码,拆解开,做的所有的事情。


    我标了 A 和 B。


    A 对应 ppt 的这一页:(注意:新建的 node,next 和 prev.next 指向同一个节点)

    https://img1.sycdn.imooc.com//climg/630d4af709814ea717920994.jpg


    B 对应了 PPT 这一页:(改变了 prev.next 的指向)

    https://img1.sycdn.imooc.com//climg/630d4b2d0936d1b818080962.jpg


    看看能不能理解了?


    然后在理解一下,为什么那一句话,就把上面这段代码的逻辑都涵盖进去了?


    继续加油!:)


    2022-08-30 07:27:22
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2589    人
  • 解答问题       1090    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师