1、概述:java
Object类是全部Java类的祖先。每一个类都使用 Object 做为超类。全部对象(包括数组)都实现这个类的方法。
在不明确给出超类的状况下,Java会自动把Object做为要定义类的超类。
可使用类型为Object的变量指向任意类型的对象。
Object类是Java中惟一没有父类的类
Object类有一个默认构造方法pubilc Object(),在构造子类实例时,都会先调用这个默认构造方法。
2、API预览
程序员
Object()
默认构造方法
数组
clone()
建立并返回此对象的一个副本。
equals(Object obj)
指示某个其余对象是否与此对象“相等”。
finalize()
当垃圾回收器肯定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
getClass()
返回一个对象的运行时类。
hashCode()
返回该对象的哈希码值。
notify()
唤醒在此对象监视器上等待的单个线程。
notifyAll()
唤醒在此对象监视器上等待的全部线程。
toString()
返回该对象的字符串表示。
wait()
致使当前的线程等待,直到其余线程调用此对象的 notify() 方法或 notifyAll() 方法。
wait(long timeout)
致使当前的线程等待,直到其余线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
wait(long timeout, int nanos)
致使当前的线程等待,直到其余线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其余某个线程中断当前线程,或者已超过某个实际时间量。dom
3、方法使用说明
equals() (判断两个对象是否相等)ide
1)基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 他们之间的比较,用双等号(==),比较的是他们的值。 函数
2)复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,因此,除非是同一个new出来的对象,他们的比较后的结果为true,不然比较后结果为false。equals()这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而再也不是比较类在堆内存中的存放地址了。工具
例:this
People p=new People(); p.setName("234"); People p2=new People(); p2.setName("234"); System.out.println(p.equals(p2)); //false System.out.println(p==p2);//false String s="123"; String s1=new String("123"); String s2=new String("123"); System.out.println(s==s1);//false System.out.println(s.equals(s1));//true System.out.println(s1==s2);//false System.out.println(s1.equals(s2));//true
Java语言规范要求equals方法具备下面的特色: spa
hashCode
的常规协定是(重写equals()时,必须重写hashcode()并保证此协定):线程
咱们会有这样的协定,举个例子:
class User { String name; public User(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { User u = (User) o; return name.equals(u.getName()); } }
public static void main(String[] args) { List<User> list = new ArrayList<User>(); list.add(new User("lily")); Map<User, String> map = new HashMap<User, String>(); map.put(new User("lily"), "11"); System.out.println(list.contains(new User("lily"))); //true System.out.println(map.containsKey(new User("lily")));//false }
缘由就不写了 。。本身领悟叭
toString()(返回该对象的字符串表示)
Object类中的toString()方法会打印出类名和对象的内存位置。几乎每一个类都会覆盖该方法,以便打印对该对象当前状态的表示。大多数(非所有)toString()方法都遵循以下格式:类名[字段名=值,字段名=值...],固然,子类应该定义本身的toString()方法。该方法是很是重要的调试工具,不少标准类库中的类都定义了toString()方法,以便程序员得到有用的调试信息
clone()(建立并返回此对象的一个副本)
建立对象的几种方式:
class Store { public static List<String> store = new ArrayList<String>(); public static int limitSize = 5; }
生产者
class Producer implements Runnable { @Override public void run() { while (true) { synchronized (Store.store) { while (Store.store.size() == Store.limitSize) { try { Store.store.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("建立一个商品"); Store.store.add(UUID.randomUUID().toString()); Store.store.notifyAll(); } } } }
消费者
class Consumer implements Runnable { @Override public void run() { while (true) { synchronized (Store.store) { while (Store.store.size() == 0) { try { Store.store.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("消费一个商品"); Store.store.remove(0); Store.store.notifyAll(); } } } }
启动生产者,消费者
public static void main(String[] args) { Thread producer = new Thread(new Producer()); Thread consumer = new Thread(new Consumer()); producer.start(); consumer.start(); }