Object o=new Object();

其中有两个受保护的方法:

            1、protected void finalize()
            2、protected Object clone()

1、System.out.println( o );//输出的时候默认调用的是该对象的toString() 方法

2、toString()

public String toString() {

return getClass().getName() + "@" + Integer.toHexString(hashCode());

}

Integer.toHexString(hashCode()):

toHexString()表示返回XXX的16进制数

3、hashCode()

源文件

public native int hashCode();     像这种没有方法体的方法,只有两种一种是抽象方法abstractnative(本地方法)

native关键字的说明:

{  使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。这些函数的实现体在DLL中,JDK的源代码中并不包含,你应该是看不到的。对于不同的平台它们也是不同的。这也是java的底层机制,实际上java就是在不同的平台上调用不同的native方法实现对操作系统的访问的。 
native 是用做java 和其他语言(如c++)进行协作时用的也就是native 后的函数的实现不是用java写的 2。既然都不是java,那就别管它的源代码了,呵呵 
native的意思就是通知操作系统,这个函数你必须给我实现,因为我要使用。所以native关键字的函数都是操作系统实现的, java只能调用。 
java是跨平台的语言,既然是跨了平台,所付出的代价就是牺牲一些对底层的控制,而java要实现对底层的控制,就需要一些其他语言的帮助,这个就是native的作用了,参考: http://blog.sina.com.cn/s/blog_67d6d5df0100yqnf.html

}

返回一个int类型的值

返回的值是由《系统》散列码算法生成的。

作用:{JVM每new一个Object,它都会将这个Object丢到一个Hash哈希表中去,这样的话,下次做Object的比较或者取这个对象的时候,它会根据对象的hashcode再从Hash表中取这个对象。这样做的目的是提高取对象的效率,

比较两个对象的时候,首先根据他们的hashcode去hash表中找他的对象,当两个对象的hashcode相同,那么就是说他们这两个对象放在Hash表中的同一个key上,那么他们一定在这个key上的链表上。那么此时就只能根据Object的equal方法来比较这个对象是否equal。}

有一个概念要牢记,两个相等对象的equals方法一定为true, 但两个hashcode相等的对象不一定是相等的对象。

参考:http://xiaotao-2010.iteye.com/blog/1249006

4、equals()

源文件:    public boolean equals(Object obj) {

return (this ==
obj);

}

5、getClass()

源文件:public final native Class<?> getClass();

Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类。类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型。

可以参考:http://hi.baidu.com/app_2006/item/3884a0f13ba5770b85d278f9

6、notify()和notifyAll()    [notify:(英文解释)被通知人]

参考文件---------------------------------------

import java.util.Random;
/*
* 线程之间的通信
*
* 先定义生产者和消费者的共享数据
*
* */ //共享数据
class Product
{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} private double price;
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
} private boolean tag=false;
public boolean isTag() {
return tag;
}
public void setTag(boolean tag) {
this.tag = tag;
} public Product()
{ }
public Product(String name,double price)
{
this.name=name;
this.price=price;
}
} //定义生产者 class Producer implements Runnable
{
Product pro=null;
Random r=new Random(); int caseProduct=-1; public Producer(Product pro)
{
this.pro=pro;
} public void run(){ if(pro==null) return ; while(true)
{
synchronized(pro){
if(pro.isTag())
{
try{
pro.wait();//等待
}
catch(InterruptedException e)
{
System.out.println("有线程中断了当前线程!");
}
}
else
{
caseProduct=r.nextInt(5);//产生一个0-5的随机数 switch(caseProduct)
{
case 1:
pro.setName("苹果");
pro.setPrice(4.0);
System.out.println("生产了一个 "+pro.getName()+" -------价钱为:"+pro.getPrice()); break;
case 2:
pro.setName("香蕉");
pro.setPrice(14.0);
System.out.println("生产了一个 "+pro.getName()+" -------价钱为:"+pro.getPrice());
break;
case 3:
pro.setName("柿子");
pro.setPrice(24.0);
System.out.println("生产了一个 "+pro.getName()+" -------价钱为:"+pro.getPrice());
break;
case 4:
pro.setName("橘子");
pro.setPrice(34.0);
System.out.println("生产了一个 "+pro.getName()+" -------价钱为:"+pro.getPrice());
break;
default:
pro.setName("枣子");
pro.setPrice(44.0);
System.out.println("生产了一个 "+pro.getName()+" -------价钱为:"+pro.getPrice());
break;
}
//唤醒线程
pro.notify();
pro.setTag(true);
}
}
}
}
} //定义消费者
class Cousumer implements Runnable
{
Product pro=null;
public Cousumer(Product pro)
{
this.pro=pro;
}
public void run(){
if (pro==null) return; while(true){
synchronized(pro){ if(pro.isTag())
{
System.out.println("吃了一个"+pro.getName()+"------价钱为:"+pro.getPrice());
pro.notify();//唤醒生产者线程
pro.setTag(false);
}
else
{
try{
pro.wait();//等待
}
catch(InterruptedException e)
{
System.out.println("有线程中断了当前线程!");
}
}
}
}
}
}
public class Demo11 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub //资源
Product product=new Product(); Producer pro=new Producer(product);
Thread th1=new Thread(pro,"生产者");
th1.start(); Cousumer cousumer=new Cousumer(product);
Thread th2=new Thread(cousumer,"消费者");
th2.start(); } }

  

-------------------------------------------------

源文件:public final native void notify();

Obj.wait(),与Obj.notify()必须要与synchronized(Obj)一起使用,也就是wait,与notify是针对已经获取了Obj锁进行操作,从语法角度来说就是Obj.wait(),Obj.notify必须在synchronized(Obj){...}语句块内。从功能上来说wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对象锁,并继续执行。相应的notify()就是对对象锁的唤醒操作。但有一点需要注意的是notify()调用后,并不是马上就释放对象锁的,而是在相应的synchronized(){}语句块执行结束,自动释放锁后,JVM会在wait()对象锁的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。这样就提供了在线程间同步、唤醒的操作。Thread.sleep()与Object.wait()二者都可以暂停当前线程,释放CPU控制权,主要的区别在于Object.wait()在释放CPU同时,释放了对象锁的控制          参考:http://blog.csdn.net/zyplus/article/details/6672775

底下是一个案例:

Wait()和notify():如果条件不满足,则等待。当条件满足时,等待该条件的线程将被唤醒。一般用在synchronized机制中。

例如:线程A

synchronized(obj) {

while(!condition) {

obj.wait();

}

obj.doSomething();

}

当线程A获得了obj锁后,发现条件condition不满足,无法继续下一处理,于是线程A就wait()。在另一线程B中,如果B更改了某些条件,使得线程A的condition条件满足了,就可以唤醒线程A。

线程B

synchronized(obj) {

condition = true;

obj.notify();

}

需要注意的概念是:

1.调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) {……} 代码段内。

2.调用obj.wait()后,线程A就释放了obj的锁,否则线程B无法获得obj锁,也就无法在synchronized(obj) {……} 代码段内唤醒A.

3.当obj.wait()方法返回后,线程A需要再次获得obj锁,才能继续执行。

4.如果A1,A2,A3都在obj.wait(),则B调用obj.notify()只能唤醒A1,A2,A3中的一个(具体哪一个由JVM决定)。

5.obj.notifyAll()则能全部唤醒A1,A2,A3,但是要继续执行obj.wait()的下一条语句,必须获得obj锁,因此,A1,A2,A3只有一个有机会获得锁继续执行,例如A1,其余的需要等待A1释放obj锁之后才能继续执行。

6.当B调用obj.notify/notifyAll的时候,B正持有obj锁,因此,A1,A2,A3虽被唤醒,但是仍无法获得obj锁。直到B退出synchronized块,释放obj锁后,A1,A2,A3中的一个才有机会获得锁继续执行。

7、wait(long timeout)wait()wait(long timeout, int nanos)

在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。

timeout 毫秒值与 nanos 毫微秒参数值之和指定的超时时间已用完。

java Object 类的更多相关文章

  1. Java Object类及其equals方法

    基本概念: Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入: Object类是所有Java类的祖先.每个类都使用 Object 作为超 ...

  2. [Java学习] Java Object类

    Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: 1 ...

  3. Java——object类

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  4. Java Object类的方法

    1. Java中所有的类都直接或者间接地继承自Object类.当没有显式地声名一个类的父类时,它会隐式地继承Object类. 2. Object类中定义了适合于任何Java对象的方法. String ...

  5. Java Object类的equals()方法

    所有类都从Object类中继承了equals方法,Object类中equals方法源代码如下: public boolean equals(Object obj)     {         retu ...

  6. Java Object类的toString()方法

    Java只要定义一个类,那么它都在继承,没有说明它在继承哪个类的时候,则默认继承java.lang.Object类,也就是说Object类是所有类的父类.看下面一段代码. public class O ...

  7. 160810、Java Object类

    Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ...

  8. 四. Java继承和多态10. Java Object类

    Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ...

  9. AJPFX关于Java Object类常用方法小总结

    java.lang.Object   java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. Object类 ...

随机推荐

  1. 《第一行代码》学习笔记4-活动Activity(2)

    1.Toast是Android系统中一种好的提醒方式,程序中使用它将一些短小的信 息通知给用户,信息会在不久自动消失,不占用任何屏幕空间. 2.定义一个弹出Toast的出发点,界面有按钮,就让点击按钮 ...

  2. SVN CornerStone的使用

    http://www.henishuo.com/mac-cornerstone-svn-use/

  3. DTO学习系列之AutoMapper(一)

    一.前言 DTO(Data Transfer Object)数据传输对象,注意关键字“数据”两个字,并不是对象传输对象(Object Transfer Object),所以只是传输数据,并不包含领域业 ...

  4. (原)python中使用plt.show()时显示图像

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6039667.html 参考网址: http://matplotlib.org/users/shell. ...

  5. HDU 5044 离线LCA算法

    昨天写了HDU 3966 ,本来这道题是很好解得,结果我想用离线LCA 耍一把,结果发现离线LCA 没理解透,错了好多遍,终得AC ,这题比起 HDU 3966要简单,因为他不用动态查询.但是我还是错 ...

  6. 读取Webpage表中的内容

    nutch将从网页中抓取到的信息放入hbase数据库中,默认情况下表名为$crawlId_webpage,但表中的内容以16进制进行表示,直接scan或者通过Java API进行读取均只能读取到16进 ...

  7. Bootstrap定制(一)less入门及编译

    第一篇博,希望支持. 近期在开发一个项目,项目前端定位于bootstrap,遂花了少许时间研究了bootstrap,将其整理整理,与众人共享. bootstrap官方的定制,功能还算完善,但是基于we ...

  8. [JS]九种网页弹窗代码

    [1.最基本的弹出窗口代码] 其实代码非常简单: <SCRIPT LANGUAGE="javascript"><!--window.open ("pag ...

  9. jquery实现导航栏头部点击变换颜色

    实现效果如下: 话不多说直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  10. Scala学习文档-列表的使用

    注:列表是不可变的,不能通过赋值改变列表的元素 列表具有递归结构,数组是连续的 scala里的列表类型是协变的?  --> scala中的逆变与协变 分治原则 //自定义实现:::操作符 def ...