一、概述:

Object类是所有Java类的祖先。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
      在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类。
      可以使用类型为Object的变量指向任意类型的对象。
      Object类是Java中唯一没有父类的类
      Object类有一个默认构造方法pubilc Object(),在构造子类实例时,都会先调用这个默认构造方法。
 二、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() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。

三、方法使用说明
equals() (判断两个对象是否相等)

1)基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean   他们之间的比较,用双等号(==),比较的是他们的值。

2)复合数据类型(类)   当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。equals()这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。

例:

        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方法具有下面的特点:

  • 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true
  • 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true
  • 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true
  • 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。 对于任何非空引用值 x,x.equals(null) 都应返回 false

hashCode()( 返回该对象的哈希码值)

  hashCode 的常规协定是(重写equals()时,必须重hashcode()并保证此协定):

  • 如果调用equals方法得到的结果为true,则两个对象的hashcode值必定相等
  • 如果equals方法得到的结果为false,则两个对象的hashcode值不一定不同
  • 如果两个对象的hashcode值不等,则equals方法得到的结果必定为false
  • 如果两个对象的hashcode值相等,则equals方法得到的结果未知

我们会有这样的协定,举个例子:

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()(创建并返回此对象的一个副本)

克隆的分类:
  (1)浅克隆(shallow clone),浅拷贝是指拷贝对象时仅仅拷贝对象本身和对象中的基本变量,而不拷贝对象包含的引用指向的对象。
  (2)深克隆(deep clone),深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
克隆的实现:
  1. 让该类实现java.lang.Cloneable接口;
  2. 重写(override)Object类的clone()方法。
(该方法是浅克隆,如果需要实现深克隆,则需要重写clone方法)
为什么克隆是浅拷贝:
1) 效率和简单性,简单的copy一个对象在堆上的的内存比遍历一个对象网然后内存深copy明显效率高并且简单。
2 ) 不给别的类强加意义。如果A实现了Cloneable,同时有一个引用指向B,如果直接复制内存进行深copy的话,意味着B在意义上也是支持Clone的,但是这个是在使用B的A中做的,B甚至都不知道。破坏了B原有的接口。
3) 有可能破坏语义。如果A实现了Cloneable,同时有一个引用指向B,该B实现为单例模式,如果直接复制内存进行深copy的话,破坏了B的单例模式。
4) 方便且更灵活,如果A引用一个不可变对象,则内存deep copy是一种浪费。Shadow copy给了程序员更好的灵活性。
克隆满足的条件:
clone()方法将对象复制了一份并返还给调用者。所谓“复制”的含义与clone()方法是怎么实现的。一般而言,clone()方法满足以下的描述:
(1)对任何的对象x,都有:x.clone()!=x。换言之,克隆对象与原对象不是同一个对象。
(2)对任何的对象x,都有:x.clone().getClass() == x.getClass(),换言之,克隆对象与原对象的类型一样。
(3)如果对象x的equals()方法定义其恰当的话,那么x.clone().equals(x)应当成立的。
在JAVA语言的API中,凡是提供了clone()方法的类,都满足上面的这些条件。JAVA语言的设计师在设计自己的clone()方法时,也应当遵守着三个条件。一般来说,上面的三个条件中的前两个是必需的,而第三个是可选的。

创建对象的几种方式:

  1)new
     new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕
  2)反射
   a: Student stu = (Student)Class.forName("根路径.Student").newInstance()
   b: Student stu = Student.class.newInstance()
区别:
> Class类的newInstance只能触发无参数的构造方法创建对象,而构造器类的newInstance能触发有参数或者任意参数的构造方法来创建对象。
> Class类的newInstance需要其构造方法是共有的或者对调用方法可见的,而构造器类的newInstance可以在特定环境下调用私有构造方法来创建对象。
> Class类的newInstance抛出类构造函数的异常,而构造器类的newInstance包装了一个InvocationTargetException异常。
  3)clone
       先分配内存,将原来对象内存里的内容copy一份。不会调用构造方法
  4)反序列化
 
 wait() & notify()
wait():
作用于持有该对象锁的当前线程,使线程从运行态,进入到等待阻塞状态,释放对象锁,释放cpu控制权,调用该方法的前提是获得对象锁
notify()/notifyAll:
作用于持有该对象锁的线程(其中一个/全部),使线程从等待阻塞状态,进入到锁池阻塞状态,调用该方法的前提是获得对象锁
举个栗子
生产者消费者模型
仓库
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();
}

java基础之 超类Object的更多相关文章

  1. Java基础教程(19)--Object类

      Object类位于类结构树的最顶端,所有的类都是它的直接或间接子类,因此所有的类都继承了Object类的方法,我们可以在需要的时候覆盖这些方法.下面是一些将会在本文中讨论的Object类的方法: ...

  2. [ 转载 ] Java基础10--关于Object类下所有方法的简单解析

    关于Object类下所有方法的简单解析 类Object是类层次结构的根类,是每一个类的父类,所有的对象包括数组,String,Integer等包装类,所以了解Object是很有必要的,话不多说,我们直 ...

  3. java基础学习总结——Object类

    一.Object类介绍

  4. Java 基础 常用API (Object类,String类,StringBuffer类)

    Java API Java 的API(API: Application(应用) Programming(程序) Interface(接口)) Java API就是JDK中提供给我们使用的类,这些类将底 ...

  5. JAVA基础系列:Object类

    1. 万物皆对象 1. JVM在编译源代码时,在遇到没有继承Object的对象的时候,编译器会默认指定一个默认的父类Object 2. Object 和接口的关系,接口是否继承Object?接口没有继 ...

  6. java基础篇之Object类

    1.Object类是所有类的超类 2.Object类的equals方法 public boolean equals(Object obj) {return (this == obj);} equals ...

  7. 【JAVA基础】10 Object类

    1. Object类概述 是类层次结构的根类 每个类都使用 Object 作为超类 所有类都直接或者间接的继承自该类 所有对象(包括数组)都实现这个类的方法. 2. Object的构造方法 publi ...

  8. 【Java基础】Java类的加载和对象创建流程的详细分析

    相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 package ...

  9. 转载-java基础学习汇总

    共2页: 1 2 下一页  Java制作证书的工具keytool用法总结 孤傲苍狼 2014-06-24 11:03 阅读:25751 评论:3     Java基础学习总结——Java对象的序列化和 ...

随机推荐

  1. python连接mysql的驱动

    对于py2.7的朋友,直接可以用MySQLdb去连接,但是MySQLdb不支持python3.x.这是需要注意的~ 那应该用什么python连接mysql的驱动呢,在stackoverflow上有人解 ...

  2. Strus2学习记录整理【持续更新】

    Strus2学习记录 以后的Strus2学习记录地址都会集合在这里,希望大家可以一起愉快学习,相互学习! Exception: 地址:http://www.cnblogs.com/gcs1995/p/ ...

  3. iOS自动化编译方案

    本文主要来源以下Bryce Zhang博主的文章,感谢博主的无私分享,转载请注明出处,尊重原创 然,根据Bryce Zhang文章进行实践过程中遇到一些问题,解决后在此做相应的总结.大神请绕道,觉得低 ...

  4. Android UiAutomator快速调试

    在测试类中添加主函数 public static void main(String[] args){ String jarName,testClass, testName,androidId; jar ...

  5. java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter

    今天在用git merge 新代码后报了如下错误:java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterE ...

  6. node config

    @echo off title node_5560 cd /d %~dp0 java -jar selenium-server-standalone-.jar ^ -role node ^ -Dweb ...

  7. Linux基础知识

    1.url中不写端口号,默认就是80端口:本机是127.0.0.1或者localhost 2.用户管理 查看当前用户: id:可以查看当前用户:whoami:查看当前的用户:who:可以查看当前已经登 ...

  8. json和jsonp(json是目的,jsonp是手段)

    自己理解:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议.我们拿最近比较火的谍战片来打个比方,JSON是地下党们用来书写和交换情报的" ...

  9. 【转】Pycharm的激活

    如果要基于Python进行开发的话,那么pycharm是个不错的选择,试用一个月以后需要激活,原文如下: 原文链接:http://blog.csdn.net/lanchunhui/article/de ...

  10. 使用SecureCRT远程链接Ubuntu出现 Change of username or service not allowed的问题

    RT:    首先是确认ubuntu上有运行 sshd服务的 但是用SecureCRT链接时报错,默认用户名是root: 打开ssh_config检查下是否禁止直接用root登陆 这句 改成yes o ...