Object基本操作(重点)
Object类:老祖宗类,所有类直接或间接继承Object
Object类中的方法是所有类都具有的方法---继承性
Object中的多态使用:
1.直接Object引用子类对象
2.Object引用传参方式接收对象
3.Object以返回值方式接收对象
class Son{
}
public class BasicTest {
public static void main(String[] args) {
Object obj1 = new Son(); //多态核心--父类引用直接指向子类对象
test(new Son());
Object obj3 = getSon(); //以返回值方式实现多态
}
private static Object getSon() {
return new Son();
}
private static void test(Object obj) { //Object以传参方式实现多态
}
}
2.2 Object的getClass方法
getClass方法: 获取Object类的类对象
class Person{
}
public class ClassTest {
public static void main(String[] args) {
Class class1 = new Object().getClass(); //获取Object的类对象
Class class2 = new Object().getClass();
//获取类对象,只要调用对象所在类是同一个类,那么类对象就是同一个
System.out.println(class1==class2); //true---反射机制
Class class3 = new Person().getClass();
Class class4 = new Person().getClass();
System.out.println(class3==class4); //true--两个都是Person类的对象,所以类对象一致
}
}
2.3.Object的hashCode方法(重点)
Object的hashCode:每个不同对象都会得到一个唯一的hash值(整数值)
应用场景:new不同对象,根据相同属性设置,决定hashCode一致
案例: 获取自定义对象的hashCode
目的: 属性一致,则hash值相同,如何做?
解决方案---重写,父类的方法不适用我,我需要重写
class Student{
String name;
public Student(String name) {
this.name = name;
}
@Override
public int hashCode(){
//重写后,将调用Object的hashCode转为了调用String类型的hashCode
return name.hashCode(); //返回属性的hashCode
}
}
public class HashCodeTest {
public static void main(String[] args) {
System.out.println(new Object().hashCode()); //不同对象,两个打印的hashCode不同
System.out.println(new Object().hashCode());
System.out.println(new Student("fengjie").hashCode());
System.out.println(new Student("fengjie").hashCode());
}
}
2.3 toString方法(重点)
Object的toString:用于打印类名@hash值
应用场景:toString一般用于打印自身对象,返回属性值的打印
处理方案:重写自定义类的toString方法
class Teacher{
private String name;
public Teacher(String name) {
this.name = name;
}
@Override //重写Object的toString方法,返回属性值
public String toString() {
return name;
}
}
public class ToStringTest {
public static void main(String[] args) {
Object obj = new Object();
System.out.println(obj.toString()); //java.lang.Object@15db9742
Teacher teacher = new Teacher("fengjie");
System.out.println(teacher.toString());
//简化版打印对象:
System.out.println(teacher);
}
}
2.4.equals方法(重点)
Object的equals方法:
比较两个对象是同一个对象,返回结果才为true, 等价于‘==’案例:自定义对象比较相等
应用场景: 往往属性值一致,则认为是同一个对象
问题: 传入相同属性名,但是调的依然是Object的equals方法,还是比较地址
解决方案: 重写equals,按自己方式比较属性值
class Star{
private String name;
public Star(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Star) {
Star star = (Star) obj;
//转为了属性String的equals的调用,String的equals方法就是比较内容的
return this.name.equals(star.name);
}else {
return false;
}
}
}
public class EqualsTest {
public static void main(String[] args) {
Object object = new Object();
System.out.println(object.equals(object)); //true
System.out.println(object==object); //true
Star star = new Star("furong");
System.out.println(star.equals(new Star("furong"))); //true
System.out.println(star.equals("furong")); //false
}
}
2.5. finalize方法
当程序中出现垃圾对象时,jvm可以通过gc(垃圾回收器),将垃圾对象进行回收
垃圾对象:就是new出来的对象,没有人使用
两种垃圾回收方式:
1.自动回收:当程序内存耗尽时,jvm会一次性将垃圾对象回收
2.手动回收:调用System.gc(),通知jvm需要进行垃圾回收了(调用finalize方法),一般都会延时回收
class Woman{
private String name;
public Woman(String name) {
this.name = name;
}
@Override //通过jvm需要回收垃圾的触发
protected void finalize() throws Throwable {
System.out.println(name+"已经被回收了");
}
}
public class FinalizeTest {
public static void main(String[] args) {
Woman woman = new Woman("刘亦菲"); //new的对象有人用
new Woman("凤姐"); //new的对象没人用--垃圾对象
System.gc(); //手动通知回收垃圾
}
}
浙公网安备 33010602011771号