一、Object 类
理解:
一个类没有明确继承的父类,都默认继承objiect类,objiect默认就是无参构造。所以object 就是所有类的祖先类(也叫基类)。
equals():
理解 :比较两个对象内存地址是否相同
//基本数据类型使用==,比较的是两个变量里的值是否相同 // int a = 10; // int b = 20; // System.out.println(a == b);//false
//引用数据类型使用==,比较的是两个对象里的内存地址是否相同 Object obj1 = new Object();//0x001 Object obj2 = new Object();//0x002 System.out.println(obj1 == obj2);//false
System.out.println(obj1.equals(obj2));//false /** * public boolean equals(Object obj){ * obj1 == obj2 * return (this == obj); * } */
getClass() :
获取该类的class对象 ( 前言: 使用到一个类如果这个类没有记载到方法区时,就会加载,加载过程是jvm 会将该类())
Object obj1 = new Object(); Object obj2 = new Object(); //获取Object类的class对象 Class<? extends Object> class1 = obj1.getClass(); Class<? extends Object> class2 = obj2.getClass(); System.out.println(class1 == class2);//true
System.out.println("获取该类的全限定名:" + class1.getName());//java.lang.Object //获取该类所有的方法(思想:万物皆对象,一个属性是一个属性对象,一个方法是一个方法对象) Method[] methods = class1.getDeclaredMethods(); for (Method method : methods) { System.out.println(method); }
hashCode() :
获取该对象的哈希码,(注意:hash码+散列算法算出的int值它不等于内存地址);
toString(): 返回对象的字符串表现形式(对象转换成字符串)
底层:
Object obj1 = new Object(); Object obj2 = new Object(); System.out.println(obj1.hashCode()); System.out.println(obj2.hashCode());
to String():
理解:返回对象的字符串表现形式(将对象转换成字符串)
Object obj1 = new Object(); Object obj2 = new Object(); //注意:打印对象,默认调用toString() System.out.println(obj1);//java.lang.Object@15db9742 System.out.println(obj2.toString());//java.lang.Object@6d06d69c
/** * public String toString(){ * return getClass().getName() + "@" + Integer.toHexString(hashCode()); * } * * getClass().getName() -> this.getClass().getName() -> obj2.getClass().getName() * 理解:获取class对象,再获取类的全限定名 -- java.lang.Object * * Integer.toHexString(hashCode()) -> Integer.toHexString(this.hashCode()); -> Integer.toHexString(obj2.hashCode()); * 理解:获取对象的hash值,再将十进制的hash值转换为十六进制的hash值 -- 6d06d69c */
Object类的深入(应用):
子类重写equesl
扩展:Object 周边底层 ---toString() equals 内容
二、抽象类
理解:将方法交给非抽象的子类去实现
应用场景:该方法在该类中,但是给方法不好实现,是交给非抽象的子类去实现
注意:抽象方法必须在抽象类中
如果子类继承了抽象类,那就必须实现抽象方法,或者全国有子类的话可以有子类来实现父类的抽象方法
三、抽象类和抽像方法的深入
面试题:
关系:
类 - 类:单继承
类 - 接口:多实现
接口与接口:多继承
1.一个类可以实现多个接口? 可以 2.一个接口可以实现多个接口? 不可以
3.接口里面的方法不一定都是抽象的? 是的 JDK1.8开始接口中允许有:静态常量、抽象方法、默认方法、静态方法
4.接口解决了类的单继承问题? 是的
5.一个类是否可以继承一个类并同时实现多个接口? 可以
6.接口可以new对象? 不可以,创建的是匿名内部类的对象
四、接口:
理解;
1.接口是一个特殊的抽象类 2.在JDK1.8之前,接口中只能有静态常量和抽象方法 3.在JDK1.8开始,接口中允许使用静态方法和默认方法 4.接口是引用数据类型的一种
应用场景:
接口:制定规则,定义哪些方法为抽象的 实现类:实现接口中的抽象方法
关系:
类 - 类:单继承
类 - 接口:多实现
接口与接口:多继承
面试题:
1.一个类可以实现多个接口? 可以 2.一个接口可以实现多个接口? 不可以
3.接口里面的方法不一定都是抽象的? 是的 JDK1.8开始接口中允许有:静态常量、抽象方法、默认方法、静态方法
4.接口解决了类的单继承问题? 是的
5.一个类是否可以继承一个类并同时实现多个接口? 可以
6.接口可以new对象? 不可以,创建的是匿名内部类的对象
创建匿名内部类对象 步骤: 1.底层创建匿名实现类,实现I1接口中的i1Method方法 public class Test01$1 implements I1{ @Override public void i1Method() { System.out.println("用良心做教育"); } } 2.创建匿名实现类对象 -- new Test01$1(); 3.将实现类对象的内存地址赋值给接口的引用