JAVA基础面试1 Object

时间不多了,快上车。

先看Jdk8 中Java中所有对象的爸爸类Object.java。

居住地址在java.lang.

总共也没有几个方法,大部分还都是native方法。

顺手把家底也掏了出来,

//object.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},
};

貌似很简单嘛。来来来,请出题。

由简入深,请听题

1 equals() 和 == 区别是什么?

      没有区别,就是对比2个引用是否相同。 obj = new Object();  Obj 引用, 暂且理解为对象的地址。

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

   但很多时候,对使用者来说,不关心是指向了同一个对象,而是两个内容是否长的一样就行,比如String类。 子类继承后要对比内容,需覆盖override此方法。

  

2 equals()和hashcode()之间关系?

     其实从jdk源码上根本看不出什么关系,没办法,这是面试官最爱问的问题之一。

  hashcode() ,这里讨论爸爸类 Object中的。  由 JVM从对象头里面尝试直接取得hashcode返回 int 类型值,通过一系列复杂运算得到,与引用不一样。

    如果hashcode不同,equals肯定不一样,因为一个对象不能有2个不同hashcode值;反之,不成立。

     equals相同,表明指向同一个对象,hashcode肯定相同;反之,不成立。

  因此如果子类override  equals(), 一般推荐重写hashcode();  原因是对象在放入容器时候,为了提升效率,利用上面的特性,优先调用hashcode,再比equals。

3  为什么要用clone?  clone 如何使用?

  一般情况,通过构造方法new 一个对象。此时的对象成员变量值都是默认值,如果要复制一个长的一样的,需要调用get/set 逐个复制。

  如果而clone方法,JVM直接复制所有成员变量引用。 注意: 这是浅copy。基本类型,copy值,引用类型复制引用。 

  子类要实现clone,前提条件implement  Cloneable,  虽然只是个空接口,JVM调用之前会做校验。

  如果只是浅copy, clone(){ super.clone()};  如果要求深层次,那必须重写,逐个clone 里面包含的对象。 JAVA设计模式中prototype。

4 finalize() ?

 喜欢和finally, final 关键字放一起。 关键字和方法,根本没有关系。

这个方法主要是JVM调用,在引用回收之前调用一次。本想发挥一下的,考虑到JDK9中已经deprecated,那就算了。

5  getClass() ?

第一次遇到传说中的 final 方法, 该方法不可以override,Class<?>返回的是带有泛型(参数)的Class对象。

核心 : java中都是对象。 在Java中,每个class都有一个相应的Class对象. 编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。

int 应该是基本类型,不属于(对象)引用类型,不能用new 构造, 这本身没毛病。

基本类型却有类类型,而且获取类类型只有一种方式,  比如说

Class intclass = int.class;

引用类型

     1 类似基本类型,静态获取方式   
Class intclass = String.class;
  2 Object.java 不是static的类方法,通过对象来调用。
Test test =new Test();
test.getClass();
     3 动态获取,  运行时exception
Class.forName();     
   三者区别
  1.类名.class    说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象
  2.Class.forName("类名字符串")  (注:类名字符串是包名+类名)  说明:装入类,并做类的静态初始化,返回Class的对象
  3.实例对象.getClass()  说明:对类进行静态初始化、非静态初始化;返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象
 

6 线程通信,多线程,锁相关的  wait  notify?

   前提条件: 必须放在Synchronized 同步块中使用。  生成者-消费者模式。 ReentrantLock 显式的实现了Lock, Monitor,condition。 这些JVM隐含实现

  wait  notify为什么不放入Thread类中?

  不管当前哪一个线程调用执行到 obj.wait(), 当前的线程就可以进入waiting队列,等待其他线程执行obj.notify(从头结点取出,放入等待唤醒队列),monitorExit (同步块和同步方法底层公用)会调用unpark唤醒。
  如果在thread类中定义,每个thread的需要相互之间知道状态,相互notify,需要直接通讯,obj充当了共享内存,实现线程通信,减少耦合。

7toString 包装使用了class  hashcode方法  略

猜你喜欢

转载自www.cnblogs.com/java-kota/p/9092491.html