一.
接下来介绍一个特殊的对象,学完继承,多态,将要讲到的,之前也接触过。
之前谈论的继承体系子父类中,一直存在super()调用父类,父类中也有一个super()调用object。现在就是讨论object对象。
object是java中所有对象的根类,不是直接的就是间接,间接就是在不断地继承,下面不断地复制上面的父类。即使一个程序中不做继承,系统仍然有一个继承,就是和object构上关系。
这个object是怎么来的呢?java是由对象构成的,对象的共性向上抽取,不断地抽取,最终形成了object类。
这意味着object类中的方法,所有对象都能用。
二.
现在简单介绍一下object类,包括类里面的内容。
object类中有object构造方法,它没有父类的构造方法,这是最终的类。→所有的类里面都有构造函数。
object类中还有许多定义好的方法,(我觉着这些是固有的,属于系统的),这些方法先介绍一部分,方便后面我们后面应用。
首先,介绍的方法是equals(object obj)方法。视频中此方法是比较两个对象是否“相等”。我们管不了怎么来评判相等,但是相等的标准是什么?这里说结果的类型是boolean类型,说明什么函数是一种运算手段,最后是为了得到结果。我们运用函数来处理数据,最后得到结果。→这是我对函数的理解。
equals(object obj)方法的参数列表是单个形参。为什么参数是一个,因为本对象调用,和输入的另一对象进行比较,有一个对象是确定好的。对于形参的输入还有一个很重要的知识点,只是比较对象是否相等,至于对象是什么类型是不做限制的,因此用object来表示其类型,这就是多态的体现,对象本身肯定不是object类型。
现在举一个例子,来展现equals()方法的运用。
(这里有一点疑问,==和equals()方法到底有什么不同?一个是运算符,另一个是功能函数,两者是不太一样,但貌似都是运算操作。)
这两种是否相同,最直接的是通过编译运行来检验。
两者都是错误,上面截图中交代了对象相等是什么意思,就是一个对象。也就是多引用指向同一对象。截图中的比较对象相等到底所的是==,还是equals()方法?两个方法说的相等到底是什么,目前还没理解深入。我个人的理解是,==代表的是比较对象的地址编号。equals()代表的是比较两个对象的内容。
这时候,修改程序,再次运行,看看这两个方法。
依据视频的讲解来看,两个方法比较的都是对象的地址编码。那为什么设置两个功能一样的东西呢?难道就是因为一个是简写,一个是函数的形式?
为什么比较对象,比较的是编码地址?我觉着对象的内容很多样,很难去逐一对比,不如直接比较整个对象的地址比较容易,要么一样,要么不同。→个人理解。
为什么equals()方法比较的对象地址,有什么依据么?
看一下object类的源代码
static共享的,private私有的,native是本地的意思,native是说明这是本地方法,有这个修饰意味着,这个方法的主题内容,你是不需要知道的,也不会给你知道。这个方法的主体内容,最后会转换成调用底层c的代码,会调用系统内容,所以这个就是本地方法,它就存放在本地方法区当中。这个方法你调用不了,你也不可能调用。
上面截图中的第二句是静态代码块,随着类的加载就执行了,它执行的就是“向本地注册”,registerNative,要把这个根类注册到本地系统上。这就是这个类一加载,就必须执行,而不管这个类创不创建对象。这就是静态代码块的应用,这叫做直接完成注册动作,至于产不产生对象不用管,类加载必须要先做,不先做就晚了。
往下看,这里面有很多本地方法。(native的存在)
本地方法怎么实现的,我们是不知道的,这依赖于系统,系统不同,它会调用现有的系统来实现自己。
这里有equals方法,当前对象和指定对象进行比较。方法体中用的是==,因此它和==是一样的。这就是我们说的equals方法为什么比较的是地址编码。它为了能够接收更多的对象进来,它就使用的是object作为参数,扩大类型。用==有限制,
再次对程序进行修改,来加深对代码的理解,
这里传入Demo类的d,因为equals方法形参设置成object类,扩大了对象类型,所以d也是可以的。