天天向上教育网

Object 类方法解说1. public Object() 构造

简介: 二、Object 类方法解说1. public Object() 构造方法我们都知道,对象是类通过构造器创建的。

Ja 中的父类也称为超类,而 Ja 是个面向对象语言,面向对象的基础就是类。

Ja 中所有类都有一个共同的祖先 Object 类,Object 类是唯一没有父类的类,Object 类引用变量可以存储任何类对象的引用。

一、Object 类中定义的方法既然所有类都继承自 Object 类,那么所有类都拥有 Object 类中定义的方法。

看下 Object 类中有哪些方法:关于 native 修饰词的说明:native 修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言中(如 C、C++),所以效率上一般比 ja 语言实现的方法要高。

Ja 本身不能对操作系统底层进行访问和操作,但是可以通过 JNI(Ja Native Interface)接口调用其他语言来实现对底层的访问。

JNI 是 Ja 本机接口(Ja Native Interface),是一个本机编程接口,它是 Ja 软件开发工具箱(ja Software Development Kit,SDK)的一部分。

Invocation API(JNI 的一部分)可以用来将 Ja 虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用 Ja 代码。

二、Object 类方法解说1. public Object() 构造方法我们都知道,对象是类通过构造器创建的。

而普通类可以不实现构造函数,那是因为所有类都是继承自 Object 类,普通类没有构造器时就会调用父类的构造器,即 Object 类中构造器。

但是 Object 是个始祖类,没有父类,自己不实现构造器的话就不能创建对象了。

2. public native int hashCode() 获取对象散列码是个本地方法,不在 Object 类中实现。

hashCode 方法返回一个整数,这个整数是对象根据特定算法计算出来的一个散列值(hash 值)。

而且 hashCode() 和 equals() 方法具有以下特性:1) 两个对象通过 equals() 判断为 true,则这两个对象的 hashCode() 返回值也必须相同。

2) 两个对象的 hashCode() 返回值相同,equals() 比较不一定需要为 true,可以是不同对象。

为什么重写 hashCode() 或 equals() 中的一个方法,另外一个方法也建议重写呢?

对于只存放几个元素的小容器,我们可以循环容器中的每个元素进行 equals() 比较,都是 false 表明不存在,那么就将这个元素放入容器。

当一个新对象 A 需要放入哈希表中时,先取对象 A 的 hashCode 一个整数,再对桶的总数求余。

如果第4个桶中没有其它元素,那么这次数据插入很顺利,直接将 A 放入第4个桶中,如果第4个桶中已经存中其它元素了,那么就需要判断 A 是否已存在,这时就遍历桶中的元素,通过 equals() 比较是否相同,都不相同则插入数据,有相同则不插入。

当表的 75% 被填入值后,再次插入数据时就会创建一个两倍原桶数的新表,再把旧表数据移到新表,旧表被丢弃。

3. public final native Class getClass() 返回运行时对象的 Class 类型对象先看一段示例:可以看出:1.Person 对象 p 和 Class 对象 cp 都是对象实例。

通过 cp 对象可以获取到类 Person 中定义的属性和方法。

所有类都继承自 Object 超类,那么所有对象都可以通过其 getClass() 方法获得生成该对象的类实例,并通过该类实例创建许多相同类型的对象,甚至访问对象的属性或方法。

其实这就是 Ja 中的反射,而 Class 类是反射得以实现的基础。

定义一个 Person 类:通过 getClass() 获取 Person 的 Class 类对象,并创建新的 Person 对象实例。

Constructor 构造器类,Class 类对象中的构造器可以通过下面的方法获取:getConstuctors() 获取类中定义的所有构造函数getCouctor() 获取类中不带参数的构造函数获取到构造器就可以通过 newInstance() 方法创建对象了。

Class 类型对象还可以通过类装载器获得,如:Class.foName("human.Person")通过反射获取对象属性:可以看到通过反射可以获取某个对象的属性,还能改变其值。

开头有个示例:Class 类型实例 cp 可以通过类 Person 的 class 获得,那么肯定已经存在一个 Class 类型实例对应 Person 类,依此类推,那 ja.lang.Object 类也会与一个 ja.lang.Class 实例相对应,而 ja.lang.Class 类又是 ja.lang.Object 类的派生类,咋一看有点混乱,不知道哪个是最先生成的。

实际上 JVM 在初始化的时候会对重要类型先分配内存空间(分配 ja.lang.Class、ja.lang.Object 等核心类型内存空间),再把对应的元数据生成好(创建 Object、Class 等实例),然后把元数据和类的引用关系串联好,这样整个对象系统就能正常工作了,也即初始化完成。

)4. public boolean equals(Object obj) 判断两个对象是否相同判断两个变量是否是同一个对象的引用,即内存地址相同。

如下:5. protected native Object clone() 克隆一个新对象clone() 方法是个本地方法,效率要高很多。

当需要复制一个相同的对象时一般都通过 clone() 来实现,而不是 new 一个新对象再把原对象的属性值等复制给新对象。

Object 类中定义的 clone() 方法是 protected 受保护的,必须在子类中重载这个方法才能使用。

clone() 方法返回的时个 Object 对象,必须进行强制类型转换才能得到需要的类型。

如下:创建一个 Person 类,并重载 clone() 方法:测试下 clone() 方法:测试发现 clone 后的对象与原对象拥有一样的属性值,但是两个不同的对象。

6. public String toString() 返回对象的字符串描述可以通过重写 toString() 方法让返回的对象信息更加丰富。

7. 多线程技术涉及方法public final native void notify() 唤醒一个正在该对象上等待的线程public final native void notifyAll() 唤醒所有正在该对象上等待的线程public final void wait() 使当前线程进入等待,直到被唤醒public final native void wait(long timeoutMillis) 使当前线程进入等待,直到被唤醒或超时(毫秒)public final void wait(long timeoutMillis, int nanos)多线程是另外一个复杂问题,这里不做过多介绍。

8. protected void finalize() 对象释放前调用方法可以重写该方法来记录一些对象释放前的信息,但是释放时间不可靠,垃圾回收器无法确定什么情况下对象会被回收,所以最好不要依赖使用 finalize() 方法。


以上是文章"

Object 类方法解说1. public Object() 构造

"的内容,欢迎阅读天天向上教育网的其它文章