java Object 类

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 毫微秒参数值之和指定的超时时间已用完。

原文地址:https://www.cnblogs.com/wucaifang/p/java.html