Object类
Object的方法介绍
含义:所有类的基类/超类
理解:一个类没有明确继承的父类,都默认继承Object,所以说Object类是所有类的祖先类
注意:Object类是所有类的超类,所以众多子类都可以调用Object中非私有化的方法
equals():判断两个对象地址是否相同
底层:
public boolean equals(Object obj){ return (this == obj); }
标杆作用:判断两个对象是否相同
理解:不同的子类判断两个对象的规则时不一样的,子类重写equals方法即可。
理解String底层:
String底层存储字符串是将字符串转换为了字符数组存储
String底层源码:
public class MyString { private char[] value; public MyString(String str){//"abc" value = str.toCharArray();//['a','b','c'] } @Override public boolean equals(Object obj) { if(this == obj){ return true; } MyString m = (MyString) obj; char[] v1 = this.value;//获取的是m1中的字符数组 char[] v2 = m.value;//获取的是m2中的字符数组 int n = v1.length; if(n != v2.length){ return false; } for (int i = 0; i < n; i++) { if(v1[i] != v2[i]){//判断两个字符串中的字符是否相同 -- Unicode return false; } } return true; } @Override public String toString() { return String.valueOf(value);//将对象中的字符数组转换为字符串 } }
测试类:
public class Test { public static void main(String[] args) { String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1 == str2);//false System.out.println(str1.equals(str2));//true System.out.println(str1); System.out.println(str2); System.out.println("--------------------------"); MyString m1 = new MyString("abc"); MyString m2 = new MyString("abc"); System.out.println(m1 == m2);//false System.out.println(m1.equals(m2));//true System.out.println(m1); System.out.println(m2); } }
使用到某个类,JVM就会把该类的class文件加载到方法区(一次),同时会在堆内存中创建该类的class对象
class对象作用该类的class文件的访问入口
getClass():获取该类的class对象
hashCode():获取到对象的hash值(hash值是通过对象的内存地址
+hash算法算出来的一个int值)
toString():将对象转换为字符串格式
标杆作用:获取我们想要的对象中的数据
理解:不同的子类有不同的属性,子类重写toString方法获取我们想要的数据即可
public String toString(){ //Integer.toHexString(hashCode()) -- 将十进制的hash值转换为十六进制 return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
final
含义:最终
作用:
修饰类:该类不能被继承
修饰方法:该方法不能被重写
修饰变量:变成常量,不能重新赋值
常量的命名规则:全大写,单词之间用下划线隔开
常量的生命周期:存在常量池中,直到项目结束才会被销毁
抽象类及抽象方法
//抽象类
public abstract class 类名{
//抽象方法
public abstract void method();
}
抽象方法交给非抽象的子类去实现(重写)
应用场景:当一个方法必须在父类中出现,但是这个方法又不好实现,就把该方法变成抽象方法,交给非抽象的子类去实现
面试题:
1.抽象类不能有构造方法? 抽象类可以有构造方法 2.抽象类中只能有抽象方法? 抽象类中有非抽象方法(成员方法和静态方法) 3.抽象类中不可以没有抽象方法? 抽象类中可以没有抽象方法,但是毫无意义 4.如果父类是抽象类,则子类必须实现父类的抽象方法? 不一定,子类如果是抽象类,可以不实现父类的抽象方法 5.可以使用new关键字来创建抽象类对象? 不可以,创建的是匿名内部类的对象
接口
含义:特殊的抽象类
注意:
- JDK1.7时,接口中只能有静态常量和抽象方法
- JDK1.8开始,接口中添加了静态方法和默认方法
应用场景:接口更像一个规范
抽象类 vs 接口
抽象类:成员变量、静态变量、静态常量、成员方法、静态方法
接口:静态常量、静态方法(JDK1.8)、默认方法(JDK1.8)
面试题:
1.一个类可以实现多个接口? 可以 2.一个接口可以实现多个接口? 不可以,接口与接口的关系是多继承 3.接口里面的方法不一定都是抽象的? JDK1.7时接口里只能有抽象方法,JDK1.8时接口可以有静态方法和默认方法 4.接口解决了类的单继承问题? 是的,因为类与类是单继承,类与接口是多实现 5.一个类是否可以继承一个类并同时实现多个接口?可以 6.接口可以new对象? 接口是特殊的抽象类,但是本质还是抽象类,抽象类是不可以new对象的,接口也是不能new对象,new出来的是匿名类内部类的对象
类 - 接口的关系:
类 - 类:单继承
类 - 接口:多实现
接口 - 接口:多继承