Object类
- 超类、基类,所有类的直接或间接父类,位于继承树的最顶层
- 任何类,如没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承
- Object类中所定义的方法,是所有对象都具有的方法
- Object类型可以存储任何对象:
作为参数,可以接受任何对象
作为返回值,可返回任何对象
getClass()方法
- public final Class<?> getClass(){}
- 返回引用中存储的实际对象类型
- 应用:通常用于判断两个引用中实际存储对象类型是否一致
public class TestMethodForGetClass {
public static void main(String[] args) {
Animal[] as = new Animal[] {new Dog(),new Cat()};
//判断数组中两个对象的真实类型是否相同
/*
if(as[0] instanceof Dog) {
if(as[1] instanceof Dog) {
System.out.println("两个都为Dog对象");
}
}
if(as[0] instanceof Cat){
if(as[1] instanceof Cat) {
System.out.println("两个都为Cat对象");
}
}*/
System.out.println(as[0].getClass()==as[1].getClass());//获取引用中的真实类型
}
}
class Animal{
}
class Dog extends Animal{}
class Cat extends Animal{}
hashCode()方法
- public int hashCode(){}
- 返回该对象的十进制的哈希码值
- 哈希算法根据对象的地址或字符串或数字计算出来的int类型的数值
- 哈希码并不唯一,可保证相同对象返回相同哈希码,尽量保证不同对象返回不同哈希码
public class TestMethodForHashCode {
public static void main(String[] args) {
Teacher t1 = new Teacher();
System.out.println(t1.hashCode());
}
}
class Teacher{}
toString方法
- public String toString(){}
- 返回该对象的字符串表示(表现形式)
- 可以根据程序需求覆盖该方法,如:展示对象各个属性值
public class TestMethodForToString {
public static void main(String[] args) {
Fish fish = new Fish();
System.out.println(fish.toString());
System.out.println(fish);//打印对象,实质打印就是该对象的toString()的结果
//打印出对象的结果后的数字由哈希码产生,由十进制的哈希码转换为十六进制的数值
//getClass()获得对象的真实类型+@+十六进制哈希码
System.out.println(fish.getClass().getName()+"@"+Integer.toHexString(fish.hashCode()));
}
}
class Fish{}
public class TestMethodForToString1 {
public static void main(String[] args) {
Worker w1 = new Worker();
w1.name="kunyan";
w1.age =12;
w1.sex ="女";
w1.salary=8000;
//System.out.println(w1.name+"\t"+w1.age+"\t"+w1.sex+"\t"+w1.salary);
//若创建很多工人对象,每一个都需要输出,则输出语句重复写很多遍
System.out.println(w1);
}
}
class Worker{
String name;
int age;
String sex;
double salary;
@Override
public String toString() {
return name + "\t" + age +"\t" + sex + "\t" + salary;
}
}
equals()方法
- public boolean equals(Object obj){}
- 默认实现为(this==obj),比较两个对象地址值是否相同
- 可进行覆盖,比较两个对象的内容是否相同
比较地址不同,但内容相同的对象需要覆盖。
public class TestMethodForEquals {
public static void main(String[] args) {
Student s1 = new Student("kunyan",20,"female",100);
Student s2 = new Student("kunyan",20,"female",100);
System.out.println(s1==s2);
//有==判断地址值是否相等,仍用equals
//字符串String类型中equals和==结果不一样,equals比内容,覆盖equals方法
System.out.println(s1.equals(s2));//为返回true
}
}
class Student{
String name;
int age;
String sex;
double score;
public Student(String name, int age, String sex, double score) {
super();
this.name = name;
this.age = age;
this.sex = sex;
this.score = score;
}
public boolean equals(Object obj) {//比较内容
//1.比较两个对象的地址是否一样
if(this == obj) {
return true;
}
//2.确认对象不为null
if(obj== null) {
return false;
}
//3.确认类型,但是值为null报错NullPointerExption
if(this.getClass() != obj.getClass()) {
return false;
}
//4.转型,传入进的参数是子类,但前提需要确认是否为Student
Student stu = (Student)obj;//想获取子类属性,则需要将父类参数转箱,转为子类类型
//5.比较内容
if(this.name.equals(stu.name) && this.age==stu.age && this.sex.equals(stu.sex) && this.score == stu.score) {//此处应为equals,若传的属性为引用类型则用==又是比较地址,内容无法确定相同
return true;
}
return false;
}
}
class MyObject{
public boolean equals(Object obj) {
return(this == obj);
}
}
finalize()方法
- 当对象被判为垃圾对象时,由JVM自动给调用此方法,用以标记垃圾对象,进入回收队列。
- 垃圾对象:没有有效引用指向此对象时,为垃圾对象
- 垃圾回收:由GC销毁垃圾对象,释放数据存储空间。
- 自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象。
- 手动回收机制:使用System.gc();通知JVM执行垃圾回收。
public class TestFinalize {
public static void main(String[] args) {
System.out.println("程序开始");
Student s1 = new Student();
s1 = null;
System.gc();//手工触发垃圾收集的工作
System.out.println("程序结束");
}
}
class Student{
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
super.finalize();//不要改
System.out.println("Student finalize() Executed");
}
}