状态影响行为。
行为影响状态。

类描述了一个对象 知道什么,以及能做什么。

调用者传递参数、方法接受参数。
💡传递的都是二进制的值!!值!!值!!!
💡传递的都是副本!副本!副本!

将对象的实例变量设置为private 。
将对象的方法设置为public。

为什么要封装?

当着500人演讲,一顿操作,最后发现自己没穿衣服。

实例变量和局部变量

实例变量有默认值,局部变量没有默认值

实参与形参

形式参数rootNode:deleteMinNode(BinarySearchTreeNode rootNode)
实际参数n3:deleteMinNode(n3);
image.png
image.png
当对象具有setvalue时,就可以通过形式参数对对象的值进行修改了,因为指针指向的是对象的setValue方法。

深入分析🧐

为什么实例变量有默认值,局部变量没有默认值?

答:从JVM的角度来看,实例变量被属于对象的一部分放在堆中,在classLoader 链接中的准备阶段,会将堆中的类变量附默认值。

💡而对象的方法不在堆中,堆中的只是方法的元数据,引用到方法区中的Class对象(元数据对象),而是在方法区或者元数据空间(jdk8+)中,只有在程序运行的时候才会通过对象对应的class信息到方法区中加载到栈中的栈帧里,所以必须要程序员提前手动赋值。

== 与equals

  • 要比较两个基本类型,则使用== 操作符。
  • 要看两个引用是否相同(这表示他们的引用的是堆heap上的同一个对象)
  • 使用equals 是两个不同 的对象是否相等。eg:两个String str1 ="123" 和String str2="123”是否相等

    深入分析🧐

    如果equals 的调用者没有重新equals 方法, 默认使用的是Object 中的equals,还是使用== 判断引用是否相同。

    public boolean equals(Object obj) {  
    return (this == obj);  
    }

    如果equals 的调用者重写了equals方法, 使用的就是重写之后 的equals。
    重写equals 必须满足一下几种条件:

    1. 自反性✔:对于任何非null引用x,x.equals(x)应该返回true。
    2. 对称性✔:对于任何非null引用x和y,如果x.equals(y)返回true,则y.equals(x)也应该返回true。
    3. 传递性✔:对于任何非null引用x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,则x.equals(z)也应该返回true。
    4. 一致性✔:对于任何非null引用x和y,只要equals方法中所用到的信息没有被修改,多次调用x.equals(y)应该总是返回相同的结果。
    5. 非空性✔:对于任何非null引用x,x.equals(null)应该返回false。
      需要重写hashCode,hashCode方法的实现保持一致,因为对象一致,对象的hashCode就要保持一致。