常用类学习(二)
Java基本类的学习(二)
Object类
概念:
-
Object类是所有类直接或者间接父类,位于继承树的顶端。
-
任何类如果没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承。
-
所定义的方法,是所有对象都具备的方法。
-
Object类型可以存储任何对象。
- 作为参数,可以接受任何对象。
- 作为返回值,可返回任何对象。
getClass()方法
- public final Class<?> getClass(){}
- 作用:返回引用中存储的实际对象类(返回需要判断的这个类是什么类型)。
- 应用:用于判断两个引用中实际存储对象类型是否一致。
public class Student{
private String name;
private int age;
public void Student(){
}
public void Student(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public String setName(String name){
this.name = name;
}
public int setAge(int age){
this.age = age;
}
}
测试类:输出结果应该为属于同一类
public class TestStudent(){
public static void main(String[] args){
student1 = new Studnet("aaa",20);
studnet2 = new Student("bbb",22);
//判断s1和s2是不是同一个类型
Class class1 = s1.getClass();
Class class2 = s2.gettClass();
if(class1 == class2){
System.out.println("s1和s2属于同一个类型");
}else{
System.out.println("s1和s2不属于同一个类型");
}
}
}
hashCode()方法
- public int hashCode(){}
- 作用:返回该对象的哈希值.
- 哈希值根据对象的地址或者字符串或数字使用hash算法计算出来的int类型的数值。
- 一般情况下相同对象返回相同的哈希码。
//hashCode方法,可以放在TestStudent(上面那个)类中测试
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
Student s3=s1;
System.out.println(s2.hashCode());
//此时执行会发现s1的hash值和s3的hash值相同
因为s1的地址与s3的地址相同,所以使用hashCode方法生成的哈希值也会相同
toString()方法
- public String toString(){}
- 作用:返回该对象的字符串表示(表现形式)。
- 可以根据程序需求覆盖(重写)该方法,如:展示对象各个属性。
演示:
//toString方法 可以放在TestStudent(上面那个)类中测试
System.out.println(s1.toString());
System.out.println(s2.toString());
会输出对象的全名称和hash值(16进制),可以自行转换与hashCode方法输出进行对比
但是这些数据有时候对于我们来说并没有意义,那么我们可以对其进行重写
//重写toString()方法 idea快捷方法 insert+control
//在上面Student类中重写方法
public String toString(){
return name + ":" + age;
}
equals()方法
- public boolean equals(Object obj){}
- 默认实现为(this == obj),比较两个对象的地址是否相同。
- 可以进行覆盖(重写),比较两个对象的内容是否相同。
测试:
//equals()方法 判断两个方法是否相等
System.out.println(s1.equals(s2));
//false
Student s4 = new Student("小明",17);
Student s5 = new Student("小明",17);
System.out.println(s1.equals(s2));
//false
| S1 | S3 | S5 |
|---|---|---|
| X00012 | X00001 | X12345 |
| S2 | S4 | 对象 |
| X00043 | X00124 | 模拟地址 |
s4,s5虽然内容一样,但是在堆中的地址并不一样
重写步骤:
@Override
public boolean equals(Object obj){
//1、判断两个对象是否是同一个引用
if(this == obj){
return true;
}
//2、判断obj是否为空null
if(obj == null){
return false;
}
//3、判断是否是同一个类型
//instanceof可以判断对象是否是某种类型
if(obj instanceof Student){
//4、强制类型转换
Student s = (Student)obj;
//5、熟悉比较
if(this.name.equals(s.getName())&&this.getAge() == obj.getAge())
}
}
这个时候再次运行上面的测试类就会发现s4.equals(s5)返回的结果为true
finalize()方法
- 当对象被系统判定为垃圾对象时,有JVM自动调用此方法,用以标记垃圾对象,进入回收队列。
- 垃圾对象定义:没有有效引用指向此对象时,为垃圾对象。
- 垃圾回收:由GC销毁垃圾对象,释放数据存储空间。
- 自动回收机制:JVM的内存耗尽,一次性回收所有的垃圾对象。
- 手动回收机制:使用System.gc();通知JVM执行垃圾回收。
重写方法:
@Override
//在Student类中重写finalize()方法
protected void finalize() throws Throwable{
System.out.println(this.name+"对象被回收了");
}
测试:
//finalize()方法
public class TestStudent2{
public static void main(String[] args){
Student s1 = new Student("aaa",20);
Student s2 = new Student("bbb",20);
Student s3 = new Student("ccc",20);
Student s4 = new Student("ddd",20);
Student s5 = new Student("eee",20);
//通知系统回收垃圾
System.out.println("回收垃圾");
}
}
执行后会发现只输出了垃圾回收,并没有输出xxx对象被回收了
原因:这些对象都在被引用所以不算垃圾对象,不会被系统清除
我们可以改成如下形式:
public class TestStudent2{
public static void main(String[] args){
new Student("aaa",20);
new Student("bbb",20);
new Student("ccc",20);
new Student("ddd",20);
new Student("eee",20);
//通知系统回收垃圾
System.out.println("回收垃圾");
}
}
大家自己测试一下就可以知道结果啦。

浙公网安备 33010602011771号