继承的使用
一、父类和子类间的转换
和基本类型的转换相同,子类(类似低精度)可以自动转换为父类(类似高精度)类型
import java.util.Date;
public class ObjectTest {
public static void main(String[] args) {
// 例如 String 和 Date两个类的父类都是Obeject类
String str = "hello";
Date date = new Date();
// 与数据类型转换类似,因为Object是父类(高精度),上述两类可以转换为Object类
Object o = str;
// str类是子类(低精度)所以object类不能够自动转换成String类
str = o;// 会报错
// 但是同样可以强制转换变成String类
str = (String) o;
}
}
关键字instanceof判断对象的类型以及是否是某个对象的子类
import java.util.Date;
public class ObjectTest {
public static void main(String[] args) {
String str = "hello";
Date date = new Date();
Object o = str;
// instanceof 关键字可以判断变量的类型
if (o instanceof String) {
System.out.println((String)o);
}
o = date;
// date类的范围是要比String类小的,所以此处强转会报错
// 加入判断后结果为否不会执行
if (o instanceof String) {
str = (String) o;
System.out.println((String)o);
}
// 判断str是否是String类的对象
System.out.println(str instanceof String);
// 判断str是否是Object的子类对象
System.out.println(str instanceof Object);
}
}
二、相关方法的使用
一切对象的继承都来自于Object类,继承的使用主要就是Object类中方法的使用
这些方法保证所有的对象都具备某些公共功能,方便垃圾区处理回收
toString():返回一个字符串,该字符串由类名(对象是该类的一个实例)、标记符“@ ”和对象的哈希码的无符号的十六进制组成。
等价于 getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
package JavaSE;
class Test{
}
public class ObjectTest {
// toString方法:返回一个字符串
// getClass().getName() + '@' + Integer.toHexString(hashCode())对象的字符串表示
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.toString());
System.out.println(test);// 直接打印对象默认会调用toString方法
}
}
打印结果为:
JavaSE.Test@6e8dacdf
表示为该对象在JavaSE包下的Test类中
在实际的使用中常将其重写,返回当前类以及所包含的属性
@Override
// 这个叫做注解,理解为写给jvm看的注释就行,这一个注解表示下面的方法是重写的
public String toString() {
return "ObjectTest{}";//返回当前的类表示这个方法在ObjectTest中,如果有属性也会一并写入
}
Intellij中Alt + insert可以选择toString()来快速的生成重写,如果该类有相关属性,也会被自动重写进入返回
equals()
public class ObjectTest {
// equals方法的使用
public static void main(String[] args) {
Stu stu1 = new Stu();
Stu stu2 = new Stu();
stu1.setName("某某");
stu1.setDegree("本科");
stu2.setName("某某");
stu2.setDegree("本科");
// 等号比较地址equals默认也会比较地址
System.out.println(stu1 == stu2); // 结果为false
System.out.println(stu1.equals(stu2));// 结果为false
}
}
class Stu{
private String name;
private String degree;
public void setName(String name) {
this.name = name;
}
public void setDegree(String degree) {
this.degree = degree;
}
}
基本上还是会对equals进行重写,仍然可以通过快捷键产生
@Override
public boolean equals(Object o) {
// 这里this就是指stu1对象,首先比较地址
if (this == o) return true;
// 下面判断它是否为空以及是否是同一个类,第一个getClass()是省略掉了this
// 为空以及不是同一个类没有可比性
if (o == null || getClass() != o.getClass()) return false;
// 这里将传进来的类强制转换为当前类
Stu stu = (Stu) o;
// 当内容都相等则返回为ture,反之为false
return Objects.equals(name, stu.name);
}
不同的IDEA会有差异,但是流程相同,比较地址是否相同 – 判断是否为空以及是否为同类 – 强制转换类 – 比较内容(对象的属性)