zoukankan      html  css  js  c++  java
  • 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 毫微秒参数值之和指定的超时时间已用完。

  • 相关阅读:
    C. Shaass and Lights 解析(思維、組合)
    D. Binary String To Subsequences(队列)(贪心)
    CodeForces 1384B2. Koa and the Beach (Hard Version)(贪心)
    CodeForces 1384B1. Koa and the Beach (Easy Version)(搜索)
    CodeForces 1384C. String Transformation 1(贪心)(并查集)
    CodeForces 1384A. Common Prefixes
    POJ-2516 Minimum Cost(最小费用最大流)
    POJ3261-Milk Patterns(后缀数组)
    HDU-1300 Pearls(斜率DP)
    HDU-4528 小明系列故事-捉迷藏(BFS)
  • 原文地址:https://www.cnblogs.com/wucaifang/p/java.html
Copyright © 2011-2022 走看看