Object类
前面说了java中,万事万物都是对象。
Object类是祖先类,也就是它是源头。
如果我们写一个类不写extends继承某个类,那么系统默认继承Object类,
如果我们写了一个类继承某个类,那么就是间接继承Object类,因为父类的父类终究有个类继承Object类。
继承Object类,不建议写,class Son extends Object,因为java的单继承模式,你写了继承Object,那么就不能继承其他类了。
在多态里面有个 Father father = new Son();父类的引用指向子类的对象。
所以java中,所有对象都可以使用Object类型去引用。即Object object = new Son(); //这里的Son这个子类名字是方便理解,根据实际情况来。
getClass()方法:得到对象所对应的类
作用:判断一个对象是不是某个类的,也可以判断多个对象是不是同一个类的对象,这样就可以了解该对象可以调用类中哪些属性和方法。
上代码,这里有一个包,里面有Father类,一个子类Son,子类Son类继承Father类
public class GetClass {
public static void main(String [] args) {
Father father1 = new Son() ; //多态,实际是子类的对象
Father father2 = new Son() ; //多态,实际是子类的对象
if( father1.getClass() == father2.getClass() ) {
System.out.println("这是同一个类的对象");
}else {
System.out.println("这不是同一个类的对象");
}
}
}
getClass().getName()方法:获取当前对象是哪个包的哪个类的
上代码,证明上面的注释
package day16;
public class GetClass {
public static void main(String [] args) {
Father father1 = new Son() ; //多态
Father father2 = new Son() ; //多态
//输出Father father1 = new Son() ;,father1到底是哪个类的
System.out.println(father1.getClass().getName());
}
}
表示father1这个实际是day16这个包的Son类的
toString()方法:当前对象的描述信息
toString()就是返回当前对象的描述信息,这个是Object这个类里面的
看看里面的原码
//这个是Objext类里面的原生toString 方法,返回的是当前对象的类名以及hashcode值
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
这里给一个例子来说明一下。
public class GetClass {
public static void main(String [] args) {
Father father1 = new Son() ; //多态
System.out.println(father1.toString());
}
}
这个@前面显示的是day16这个包里面的Son类的对象,和getClass().getName()一样的,@后面的就是hashcode值,对我们是没有是没有什么作用的,但是计算机按照这个值去找保存的属性和方法。
所以我们一般重写这个toString方法,因为我们通常是要获得当前对象的属性值,而不是一个地址。
注意toString是只能用public 修饰的然后返回值是String
子类如下:
public class Son extends Father{
private String name ;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写Object类的方法,获取当前对象的属性值
public String toString() {
return "姓名为:" + name + ",年龄为:" + age ;
}
}
main函数如下:
package day16;
public class GetClass {
public static void main(String [] args) {
Son son1 = new Son();
//因为是私有属性并且没有写有参构造函数,所以不能调用构造方法来创建对象,通过set属性()方法来设值
son1.setName("王五");
son1.setAge(18);
//打印出来看看
System.out.println(son1.toString());
}
}
改写后输出当前对象设置的属性,这样才是我们想要获得的值。
equal()方法和hashCode()方法
hashCode()方法是通过对象的地址或者一些关键属性(比如字符串,数字,像每个人的身份证号码样)生成一个int类型的值。需要尽量保证不同的对象有不同的hashCode值,一定要保证相同对象有相同的hashCode值。
equals()方法是通过比较对象来看是不是相同。一般情况下是用= =来比较。一般是需要重写的,在重写equals方法时一定要重写hashCode方法,重写后根据主要属性来判断对象是否时相同的对象
重写后根据主要属性来判断对象是否时相同的对象
怎么重写呢,Eclipse里面是鼠标右键—> source ---->Generate hashCode() and equals()
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Son other = (Son) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
main()方法
//创建两个对象
Son son1 = new Son();
Son son2 = new Son();
//给私有属性赋值
son1.setName("王五");
son1.setAge(18);
son2.setName("王五");
son2.setAge(18);
//输出看是不是同一个对象
System.out.println(son1.equals(son2));
看来重写后的方法,可以通过判断属性值是不是相等来判断两个对象是不是相同的,因为对象里保存的是属性值,说明属性值相等,那么系统也会识别为相同的对象。
finalize()方法,提醒系统进行垃圾回收,仅仅是提醒
finalize()方法,属于JVM自动调用,用来标记垃圾对象,进入回收队列。
Java种垃圾回收是定时回收,可以使用System.gc()方法请求进行垃圾回收,并不能立即调用垃圾回收