目录
我们在进行java开发时,不需要从最底层开始编写自己的程序,java已经提供给我们了一些可以使用的类,
这些类将底层的实现封装起来了,我们也不需要关心这些类如何实现的,只需要知道如何使用即可。
一、Object类概述
Object类是所有类层次结构的跟类,所有类都直接或者间接继承自该类,
当用户定义了一个自己的类时,如果没有显示指出是继承哪个类的,那么这个类就是默认继承Object类,
二、getClass方法
Object对象作为所有对象的基类,其中有一个比较重要的方法getClass,
该方法返回此对象的运行类,返回类型Class为类对象,接着我们通过Class类中的getName方法输出运行类的名字,
我们通过一段程序来体会一下getClass方法如何使用,
public class InnerOuter {
public static void main(String []args){
Outer outer=new Outer();
Class temp=outer.getClass();
System.out.println(temp.getName());
}
}
class Outer{
}
结果可以看到输出了类的名字,
三、toString方法
Object对象中还有一个toString方法,我们可以看看源码这个方法是做什么的,
在java的API说明文档中,描述该方法返回对象的字符串表现形式,实现源码如下:
getClass().getName() + '@' + Integer.toHexString(hashCode());
我们可以看到前面的getClass和getName我们之前已经使用过了,后面的Integer.toHexString(hashCode())表示的是该对象的地址空间,并且是十六进制表示的,
使用toString方法还有一个很方便的好处,就是可以用户自己重写该方法,直接显示类中包含的属性值,
因为该功能非常好用,所以很多类在继承Object类时重写了toString方法,
这样就可以直接看到类中包含什么属性,还有一个值得注意的是,如果直接打印某个对象,系统会隐式调用toString方法,打印出返回的String类型字符串。
在IDEA中有一个快捷键可以自动生成重写后的toString方法,组合为Alt+Insert键,然后选择toString方法即可
public class InnerOuter {
public static void main(String []args){
Person p=new Person();
System.out.println(p);
}
}
class Person{
//请输入你的代码
public String name="testName";
public int age=20;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
我们可以看到输出结果,
四、equals方法
Object中的equals方法是比较对象的地址值的,没有什么实际意义,我们需要重写,
在开发中我们通常需要比较对象中的属性值,只有属性值相同了我们才认为两个对象相同,
同样的在IDEA中我们可以使用Alt+Insert键来自动生成重写后的equals方法,接着我们用一段代码测试一下重写后的equals方法:
import java.util.Objects;
public class InnerOuter {
public static void main(String []args){
Person p1=new Person("name1",20);
Person p2=new Person("name1",20);
System.out.println(p1.equals(p2));
}
}
class Person{
//请输入你的代码
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String name="testName";
public int age=0;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
}
可以看到输出结果:
Tips:这里有个需要注意的点,就是==号和equals方法,
两者都是作比较的运算,而且返回值类型都是boolean,
他们主要有两点区别:
- ==号是比较运算符,既可以比较基本数据类型(值比较),也可以比较引用数据类型(地址值比较)
- 而equals只能比较引用数据类型,默认底层依赖的是==号,重写之后比较的是引用数据类型的各个属性是否相同