- 浏览: 110346 次
- 性别:
- 来自: 杭州
文章分类
最新评论
Object类的方法
构造方法:public Object()
在Object的源代码中并没有Object的构造方法,而是采用了java内置的默认构造方法。即在编译时由编译器完成这项工作。
值得注意的是在Object源码的开始,有这样一段:
private static native void registerNatives();
static {
registerNatives();
}
使用JNI特性(有其他语言实现这个功能)来做的这样一个方法,这个方法由Java虚拟机在创造对象时调用,其功能是初始化一个对象:分配内存空间,定义变量,产生this指针等等。
紧接着下面的静态代码块(当该类被实例化、继承、构造方法调用时都优先执行该代码块):也就是说,java中所有代码执行前都要执行这一个JNI实现的方法。
public final native Class<?> getClass();
native方法,返回当前对象的运行时类。(运行时类是指在程序运行时所确定的类型)
public native int hashCode();
native方法,返回对象的hash码值,支持此方法是为了提供hash表的性能。
这里需要特别注意:
在object类中,一般情况下不同的实例对象调用hashCode方法返回不用的哈希码值,但当对象数量太多时就会出现重复。所以不建议使用比较哈希码值的方法来判断实例对象是否同一。
public boolean equals(Object obj)
源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
可以发现,此处使用了关系运算符"=="所判断的是实例对象而不是实例对象的取值.这里我们不难推测关系运算符判断引用数据类型都是从实例对象出发的。
其实就是,Object中的equals方法等价于”==”操作。当继承类复写了equals方法时才会有equal()与”==”不等的说法。
equals()方法需要具有如下特点:
u 自反性(reflexive):任何非空引用x,x.equals(x)返回为true。
u 对称性(symmetric):任何非空引用x和y,x.equals(y)返回true当且仅当y.equals(x)返回true。
u 传递性(transitive):任何非空引用x和y,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)返回true。
u 一致性(consistent):两个非空引用x和y,x.equals(y)的多次调用应该保持一致的结果,(前提条件是在多次比较之间没有修改x和y用于比较的相关信息)。
u 约定:对于任何非空引用x,x.equals(null)应该返回为false。
并且覆写equals()方法时,应该同时覆写hashCode()方法,反之亦然。
protected native Object clone() throws CloneNotSupportedException
native方法,创建并且返回该对象的一个副本。要调用这个方法必须实现cloneable接口。该方法的注释有这样一个描述:
x.clone() != x
x.clone().getClass() == x.getClass()
x.clone().equals(x)
都为真
notify()方法
方法申明如下:
public final native void notify ();
唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。
notifyAll()方法
方法申明:
public final native void notifyAll();
唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个wait 方法,在对象的监视器上等待。
wait(long timeout)方法
源码:
public final native void wait(long timeout) throws InterruptedException;
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
也就是说wait方法要在其他线程调用对象的 notify方法或notifyAll方法或超过指定的时间量前调用才有意义。
9. String toString()方法
源码如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
10. protected void finalize() throws Throwable
源码:
注释说的是:当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。
也就是说:
子类如果想在释放该对象的同时释放掉其他对象的话就重写该方法,但要注意如释放的对象仍然有引用的话容易出现错误,抛出异常
构造方法:public Object()
在Object的源代码中并没有Object的构造方法,而是采用了java内置的默认构造方法。即在编译时由编译器完成这项工作。
值得注意的是在Object源码的开始,有这样一段:
private static native void registerNatives();
static {
registerNatives();
}
使用JNI特性(有其他语言实现这个功能)来做的这样一个方法,这个方法由Java虚拟机在创造对象时调用,其功能是初始化一个对象:分配内存空间,定义变量,产生this指针等等。
紧接着下面的静态代码块(当该类被实例化、继承、构造方法调用时都优先执行该代码块):也就是说,java中所有代码执行前都要执行这一个JNI实现的方法。
public final native Class<?> getClass();
native方法,返回当前对象的运行时类。(运行时类是指在程序运行时所确定的类型)
public native int hashCode();
native方法,返回对象的hash码值,支持此方法是为了提供hash表的性能。
这里需要特别注意:
在object类中,一般情况下不同的实例对象调用hashCode方法返回不用的哈希码值,但当对象数量太多时就会出现重复。所以不建议使用比较哈希码值的方法来判断实例对象是否同一。
public boolean equals(Object obj)
源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
可以发现,此处使用了关系运算符"=="所判断的是实例对象而不是实例对象的取值.这里我们不难推测关系运算符判断引用数据类型都是从实例对象出发的。
其实就是,Object中的equals方法等价于”==”操作。当继承类复写了equals方法时才会有equal()与”==”不等的说法。
equals()方法需要具有如下特点:
u 自反性(reflexive):任何非空引用x,x.equals(x)返回为true。
u 对称性(symmetric):任何非空引用x和y,x.equals(y)返回true当且仅当y.equals(x)返回true。
u 传递性(transitive):任何非空引用x和y,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)返回true。
u 一致性(consistent):两个非空引用x和y,x.equals(y)的多次调用应该保持一致的结果,(前提条件是在多次比较之间没有修改x和y用于比较的相关信息)。
u 约定:对于任何非空引用x,x.equals(null)应该返回为false。
并且覆写equals()方法时,应该同时覆写hashCode()方法,反之亦然。
protected native Object clone() throws CloneNotSupportedException
native方法,创建并且返回该对象的一个副本。要调用这个方法必须实现cloneable接口。该方法的注释有这样一个描述:
x.clone() != x
x.clone().getClass() == x.getClass()
x.clone().equals(x)
都为真
notify()方法
方法申明如下:
public final native void notify ();
唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。
notifyAll()方法
方法申明:
public final native void notifyAll();
唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个wait 方法,在对象的监视器上等待。
wait(long timeout)方法
源码:
public final native void wait(long timeout) throws InterruptedException;
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
也就是说wait方法要在其他线程调用对象的 notify方法或notifyAll方法或超过指定的时间量前调用才有意义。
9. String toString()方法
源码如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
10. protected void finalize() throws Throwable
源码:
注释说的是:当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。
也就是说:
子类如果想在释放该对象的同时释放掉其他对象的话就重写该方法,但要注意如释放的对象仍然有引用的话容易出现错误,抛出异常
发表评论
-
Java线程Dump分析工具--jstack(转摘纪录)
2015-10-29 10:47 854jstack用于打印出给 ... -
多角度看 Java 中的泛型
2014-05-13 15:40 735本文摘自:http://www.ibm.c ... -
为什么Java byte 类型的取值范围是-128~127(short int long同理)
2014-05-12 18:08 2099为什么Java byte 类型的取值范围是-128~127 ... -
web.xml之context-param,listener,filter, servlet启动顺序和讲解
2014-05-12 14:32 1002首先可以确定的一点是, 不同类型节点的加载顺序与它们在web. ... -
java对象初始化书序
2014-05-09 15:05 595package com.test.aa.service; p ... -
java.lang.ThreadLocal详解以及注意事项
2014-04-29 18:12 2543一.什么是ThreadLocal? ThreadLocal ... -
String Stringbuilder StringBuffer区别
2014-04-17 11:00 712关于这三者的区别,我们从官方API上很容易找到答案。 ... -
JAVA反射机制
2014-04-03 15:15 342JAVA反射机制: 通俗地说,反射机制就是可以把一个类, ... -
ArrayList和linkedList几种循环性能比较
2014-03-26 17:51 643请 参照 http://www.trinea.cn/andr ... -
HashMap原理
2014-03-20 15:31 557本文由 ImportNew - 唐小娟 ... -
java.lang.Cloneable
2014-03-20 11:22 605public interface Cloneable 此类实 ... -
Java集合框架学习总结
2014-03-14 16:43 736以下介绍经常使用的集合类,这里不介绍集合类的使用方法,只介绍 ... -
maven项目管理的一些知识
2014-03-04 16:24 555http://sishuok.com/forum/blogPo ... -
ehcache使用注意 及一些问题的解决
2014-02-21 17:35 866配置 1. applicationContext.xml ... -
Xms Xmx PermSize MaxPermSize 区别
2014-02-20 16:13 642Eclipse崩溃,错误提示: ... -
JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配
2014-01-17 20:00 1133堆:顺序随意 栈:后进 ... -
debug遇到找不到源码的情况解决方案
2013-12-19 18:46 774在做JAVA开发的时候 页面端调用了接口服务端 找问题需要页面 ... -
工作学习2013-11-6
2013-11-06 20:20 5281.在用maven进行项目构建的时候 可以先建立以个maven ... -
运行jtest出现 No value found for property database.type 错误解决办法
2013-06-06 11:25 1781错误信息: Caused by: org.jtester.mo ...
相关推荐
在Java编程中,`java.lang.IllegalArgumentException` 是一个标准的运行时异常,它通常表示一个方法接收到的参数值不在预期范围内或者不合法。当尝试将一个无法转换为日期的对象格式化时,就会抛出"Cannot format ...
在Java编程语言中,`java.lang.reflect`包是核心库的一部分,它提供了运行时访问类、接口、字段和方法的能力。这个包对于理解和操作对象的动态特性至关重要,尤其是在实现反射机制时。反射允许我们在程序运行期间...
在Java编程中,`java.lang.RuntimeException` 是一个非检查异常(unchecked exception),它表示程序运行时出现的不正常情况。通常,这类异常是由于程序员的错误或代码逻辑的疏忽造成的,例如类型转换错误、空指针...
Caused by: java.lang.RuntimeException: javax.management.remote.JMXServerErrorException: java.lang.AssertionError: Registered more than one instance with the same objectName : com.bea:Name=wl04,Type=...
`java.lang`包中最基本的类是`Object`,它是所有类层次结构的根,而`Class`类的实例则代表运行时的类。 `java.lang`包包括以下关键类: 1. **Boolean**: 表示布尔值`true`和`false`。 2. **Long, Short, Byte, ...
`Object`类是所有Java类的最终超类,包含所有对象共有的属性和方法,如`equals()`比较两个对象是否相等,`hashCode()`返回对象的哈希码,`toString()`返回对象的字符串表示。 通过理解并熟练使用`java.lang`包中的...
在给出的标题 "java.lang.NoSuchMethodException: .getPortClassMap()" 中,异常指向了 `getPortClassMap()` 这个方法,暗示在程序运行时,尝试访问或调用的这个方法在相应的类中没有被找到。 `getPortClassMap` ...
Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java中基本的类java.lang.Object开始谈起。 Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起。作为其他所有类的基类,Object...
在Android开发中,Java编程时常会遇到`java.lang.IllegalArgumentException`异常,这通常表示传入的参数不符合方法的要求。在本例中,错误信息“contains a path separator”提示我们问题可能与路径分隔符有关,这...
了解 java.lang 包 掌握包装类 掌握String 和 StringBuffer 类 运用以下类的方法: Math Class Object
- **异常路径**:`java.lang.Object -> java.lang.Throwable -> java.lang.Exception -> java.lang.RuntimeException -> java.lang.IndexOutOfBoundsException -> java.lang.ArrayIndexOutOfBoundsException` ...
当Java程序通过`Class.forName()`方法或者使用`ClassLoader`加载类时,如果在当前的类路径(Class Path)下找不到指定类的`.class`文件,就会抛出这个异常。这可能是由于以下原因: 1. **类路径设置不正确**:确保...
boolean delete(java.lang.String sql, java.util.Map<java.lang.Integer,java.lang.Object> elements) 根据传入的参数删除单条记录的方法 boolean delete(java.lang.String sql, java.lang.Object[] elements)...
Java.lang.Class类 Java.lang.Class类是Java语言中一个非常重要的类,它封装了对象和接口的运行时状态。当Java程序在运行时,Java虚拟机(JVM)会对所有对象进行类型标识,这项信息记录了每个对象所属的类。Class类...
boolean delete(java.lang.String sql, java.util.Map<java.lang.Integer,java.lang.Object> elements) 根据传入的参数删除单条记录的方法 boolean delete(java.lang.String sql, java.lang.Object[] elements)...
java.lang.object原始码最终不推荐使用java.lang.Object.finalize() 我的博客文章中的示例的Gradle源代码存储库。 在Linux Mint(SUSE Linux)上构建和测试。 由于gradle当前不支持Java 11,因此可以使用标准Java...
在Java编程中,`java.lang.ClassCastException`是一个运行时异常,通常发生在强制类型转换时,如果尝试将一个对象转换为其非兼容类型时就会抛出。这个异常表明在编译时可能成功的类型转换,在运行时被证明是错误的。...
`Object`类是所有Java类的根,它定义了所有对象共有的行为,如`equals()`、`hashCode()`和`toString()`方法。`System`类提供了系统级的服务,如标准输入、输出流,以及全局变量`out`、`err`和`in`。 `Thread`类是多...
在Java编程语言中,`java.lang.String`是最重要的类之一,它是所有字符串操作的基础。这个类位于核心类库中,因此无需显式导入即可使用。本文将深入探讨`String`类的一些关键知识点,包括它的特性、构造方法、常用...