Java - Object类

1. 意义

为什么今天我想说这个类呢,因为作为the root of class hierarchy,我发现我竟没有认认真真好好理解它的内容以及所有方法的意义。这似乎是不应该的。。。。so,补课,重新学习它

定义:

Object对象是Java类层次结构的根类,所有类的超类
所有的对象(包括数组)都实现这个类的方法

2. 方法

JavaSE7API中的Outline

  1. Object()

    构造方法,默认的,没有显示声明

  2. private static native void registerNatives()

    private static native void registerNatives();
    static {
     registerNatives();
    }

    很多类中都有的一段JNI代码,用于统一的将当前类的所有native方法映射到相应的C方法上

    比如,这个Object里的这个方法对应的OpenJDK源码(源码相对目录:…\openjdk\jdk\src\share\native\java\lang下)中C代码是

    
    static JNINativeMethod methods[] = {
     {"hashCode",    "()I",                    (void *)&JVM_IHashCode},
     {"wait",        "(J)V",                   (void *)&JVM_MonitorWait},
     {"notify",      "()V",                    (void *)&JVM_MonitorNotify},
     {"notifyAll",   "()V",                    (void *)&JVM_MonitorNotifyAll},
     {"clone",       "()Ljava/lang/Object;",   (void *)&JVM_Clone},
    };
    
    JNIEXPORT void JNICALL
    Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
    {
     (*env)->RegisterNatives(env, cls,
                             methods, sizeof(methods)/sizeof(methods[0]));
    }
    
    JNIEXPORT jclass JNICALL
    Java_java_lang_Object_getClass(JNIEnv *env, jobject this)
    {
     if (this == NULL) {
         JNU_ThrowNullPointerException(env, NULL);
         return 0;
     } else {
         return (*env)->GetObjectClass(env, this);
     }
    }
    

    可以看到,这里映射了5个具体的native方法:hashCode、wait、notify、notifyAll、clone和实现了一个方法getClass

  3. public final native Class<?> getClass()

    不可被覆盖的final方法,其返回的是当前内存中的被引用的实际对象的class,而不是字面上看上去的对象的class

    例如,最常见的一道面试题会这样问:

     super.getClass().getName();
     //返回的是什么?
     //    答案并非父类的名字,而是当前this对象的class对象的名字
     //而要获取父类的名字可以如下
     getClass().getSuperClass().getName();
  4. public native int hashCode()

    返回当前对象的hash code,这个方法用于提高hash表的性能(例如java.util.Hashtable提供的hash表)

    这个方法的general contract是:

    1. 同一个对象多此调用hashCode()必须返回相同的整数,前提是对象的equals()方法用到的信息没有被修改
    2. 如果根据equals()方法,两个对象是相等的,那么hashCode必须返回相同的整数
    3. 如果根据equals()方法,两个对象不相等,那么也有可能hashCode相等

    这个

  5. public boolean equals(Object obj)

    public boolean equals(Object obj) {
     return (this == obj);
    }

    equals方法指示对象是否“相等”

    Object类中这个equals实现的是对象上差别可能性最大的相等关系,即,对于非空引用x和y,仅当其引用的是同一个对象时才返回true

    equals方法在非空引用上实现相等关系必须满足几个性质:

    1. 自反性:x..equals(x) 必须为true
    2. 对称性:y.equals(x)为true,x.equals(y)也应为true
    3. 传递性:x.equals(y),y.equals(z)那么x.equals(z)也应为true
    4. 一致性:多此调用equals,结果应该一致,在equals所用信息没有被修改的前提下
    5. x.equals(null)必须为false

    如果重写equals方法,通常有必要重写hashCode方法,用以维护hashCode方法的常规协定,来保证equals的对象必须具有相等的hash code

  6. protected native Object clone() throws CloneNotSupportedException

    克隆当前对象生成新的实例

    • 被克隆对象必须实现接口 Cloneable
    • 所有数组都被看做已经实现了Cloneable
    • 这个clone是“浅表 copy”而不是“deep copy”

    shallow copy就是说没有clone源对象的引用成员变量所指向的对象,而是直接使用了源对象的引用

    一道面试题:怎么(浅表copy)clone对象?clone()方法通常都有一行代码,是什么?

    答案:
    实现Cloneable接口并override重写clone()方法;
    super.clone(),按照惯例克隆对象必须通过super.clone()来完成

    代码:

    class A implements Cloneable{
     public Object clone() throws CloneNotSupportedException {
         A cloned = (A) super.clone();
         //cloned.xxx引用成员 = (B) xxx引用成员.clone() //这是deep clone
         return cloned;
     }
    }
  7. public String toString()

     public String toString() {
         return getClass().getName() + "@" + Integer.toHexString(hashCode());
     }

    方法返回对象的字符串表示。建议所有子类重写此方法

    Object类默认的toString()返回一个字符串,值为:

    getClass().getName() + "@" + Integer.toHexString(hashCode());
  8. public final native void notify()

    唤醒在此对象监视器上waiting的单个线程。如果有很多线程都在此对象上waiting,则会任意选择一个唤醒。线程通过调用wait方法,使自己处于waiting状态

    被唤醒的线程将以常规的方式与其它在该对象上同步的所有线程进行竞争

    notify()方法只能被对象监视器当前所有者线程来调用,一次只能有一个线程拥有对象的监视器。有3种方法,线程可以称为对象监视器的拥有者:

    1. 执行对象的synchronized实例方法
    2. 执行对象的synchronized语句
    3. 对于Class类型的对象,可以执行类的synchronized静态方法
  9. public final native void notifyAll()

    唤醒在此对象监视器上waiting的所有线程,其它参考notify

  10. public final native void wait(long timeout) throws InterruptedException

    使当前线程waiting并进入当前对象监视器的wati set中,直到超出timeout或notify被调用

    注意:
    调用对象的wait()类方法时,对象必须拥有对象监视器的锁,如果没有将抛出异常“IllegalMonitorStateException”。也就是说必须在synchronized语句块中调用(或java.util.concurrent包中类);

    另外:
    调用wait(0),相当于调用wait()会一直被wait
    11和12最终还是调用10这个方法

  11. public final void wait(long timeout, int nanos) throws InterruptedException

    纳秒级别控制wait时间

    最终还是调用

    wait(timeout);
  12. public final void wait() throws InterruptedException

    public final void wait() throws InterruptedException {
        wait(0);
    }
  13. protected void finalize() throws Throwable { }

    当GC确定不存在该对象的更多引用,想要清楚此对象时,GC会调用该方法。子类重写此方法,以处置系统资源或执行其它清除

    你当然可以在GC将要回收时,在finalize方法中重新使此对象对其它线程可用(救下它),但是,finalize()方法的主要目的是:在不可撤销(前面说的操作叫撤销)的要丢弃对象的情况下,给你一个机会让你去执行一些清除操作。例如,输入/输出连接的相关对象的finalize方法可以显示的执行I/O事务,以便在丢弃对象前中断连接

    • finalize被执行后,对象不会立马被丢弃,JVM会再次确定一遍,如果还是“不可达”,才会真正丢弃
    • 对于一个对象,JVM最多只会调用一次finalize方法
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ObjectJava 中的根,是所有的父。所有的 Java (除了八个基本型)都继承于 Object ,因此可以调用 Object 的方法。例如:toString()、equals()、hashCode() 等。 ### 回答2: jmu-java-03面向对象基础-object 是一门介绍面向对象编程的基础知识的课程。面向对象编程是一种思想,它的目标是把程序中的各个元素抽象成对象,并通过对象之间的交互实现程序的功能,是现代编程语言的主流之一。在这门课程中,学生将学习到对象的定义、的概念、封装、继承和多态等基本概念和原则。 在面向对象编程中,对象是指具有特定属性和行为的实体,例如一个人、一辆车、一本书等。对象拥有自己的状态和行为,其行为可以通过方法来实现。对象的模板,可以看作是一种具有相似特征和行为的对象的集合。在中,可以定义属性、方法和构造函数等。封装是面向对象编程的一个重要原则,它通过将对象的内部状态信息封装起来,从而实现了信息的隐藏和保护。 继承是指通过继承父的属性和方法来创建一个新的子的机制。子可以继承并扩展父的行为,从而实现了代码的重用性和可维护性。多态是指不同对象对同一消息做出不同的响应的能力。多态是面向对象编程中的一种普遍机制,它可以让程序具有更好的灵活性和扩展性。 这门课程将通过理论和实践相结合的方式来教授相关知识和技能。学生将通过编写程序来巩固所学内容,并提高编程能力。本门课程是学习Java编程的基础课程,也是后续Java编程课程的前置课程。具备面向对象编程基础的学生,将更容易掌握高级Java编程知识和技能。 ### 回答3: 面向对象编程(Object-Oriented Programming, OOP)是一种编程方式,它基于对象的概念,强调对数据的封装、继承和多态等特性,从而使得程序的结构更加清晰、易于维护和扩展。 OOP中最基本的概念是对象(Object),它是程序中的一个实体,有其自身的状态(state)和行为(behavior)。在Java语言中,对象(Class)定义,是一组具有相同特征和行为的对象的模板。 通常由属性(fields)和方法(methods)组成,属性可以理解为数据单元,方法则是实现的动作。例如,一个人(Person)可以包含属性如姓名、年龄等,方法如呼吸、吃饭等。 封装(Encapsulation)是OOP中的重要概念之一,它指对的属性和方法进行隐藏和保护,只能通过提供的公共接口访问。这样能够保证程序的安全性,同时也能够减少程序的耦合度,便于维护和扩展。在Java语言中,可以通过访问修饰符(private、protected、public)来实现封装。 继承(Inheritance)是另一个重要的OOP概念,它允许一个(子)从另一个(父)继承属性和方法,并在此基础上进行扩展。这样能够避免重复编写代码,同时也能够保持代码的一致性和可读性。在Java语言中,使用关键字extends来实现继承。 多态(Polymorphism)是OOP的另一个重要概念,它指同一个方法调用在不同情况下会产生不同的行为。在Java语言中,通过方法的重载(overloading)和重写(overriding)来实现多态。 总之,面向对象编程已经成为现代软件开发的主流,它使程序的开发更加清晰和高效,也更加适应复杂应用的开发。在学习Java编程的过程中,理解面向对象编程的基本概念,对于学习Java语言和掌握Java编程技能是至关重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值