JavaSE之Object类
Object类简介
Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父类。即,所有类的对象都可以使用Object进行接收。
范例:使用Object接收所有类的对象
class Father{};
class Child{};
public class Test {
public static void main(String[] args) {
fun(new Father());
fun(new Child());
}
public static void fun(Object obj){
System.out.println(obj);
}
}
运行结果:
直接使用对象输出,默认输出一个地址编码。
Object类中的方法
object类中有很多方法,这里只是简单介绍几个常用的
取得对象信息->toString()
直接使用对象输出,默认输出一个地址编码。如果现在输出的是String对象,此时输出字符串内容而非地址,原因就在于String类覆写了Object的toString()方法。
范例:观察String类与Object类的输出
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
}
public class Test {
public static void main(String[] args) {
fun(new Person("HL",18));
fun("HL");
}
public static void fun(Object obj){
System.out.println(obj.toString());
// System.out.println(obj);//系统默认会调用toString()方法,所以这两个代码是一样的
}
}
如果觉得默认给出的toString()方法功能不足,就在需要的子类上覆写toString()方法。
范例:覆写toString()方法
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名->"+this.name+"\n年龄->"+this.age;
}
}
public class Test {
public static void main(String[] args) {
fun(new Person("HL",18));
fun("HL");
}
public static void fun(Object obj){
System.out.println(obj.toString());
}
}
为什么object类直接使用对象输出,默认输出一个地址编码?
我们看它的内部实现就明白了,如下:
public String toString(){
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
对象比较->equals()
实际上String类的equals()方法就是覆写的Object类中的equals()方法。
范例:实现对象比较
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名->"+this.name+"\n年龄->"+this.age;
}
}
public class Test {
public static void main(String[] args) {
Person per1=new Person("HL",18);
Person per2=new Person("HL",18);
System.out.println(per1==per2);//false
System.out.println(per1.equals(per2));//false
}
}
为什么两个输出的都是false呢?我们看object类中equals的实现就会明白。默认的object类中的equals()方法是比较对象的编码地址。
public boolean equals(Object obj){
return (this==obj);
}
所以要比较两个对象中的属性是否相等,就必须自己手动一个equals()方法来覆写object类中的equals()。
范例:
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public boolean equals(Object obj){
//判断obj能否指向Person类实例
if(!(obj instanceof Person)){
return false;
}
if(obj==this){
return true;
}
//向下转型,取得Person类的name与age属性
Person per=(Person)obj;
return per.name.equals(this.name)&&(per.age==this.age);
}
}
public class Test {
public static void main(String[] args) {
Person per1=new Person("HL",18);
Person per2=new Person("HL",18);
System.out.println(per1.equals(per2));//true
}
}
接收引用数据类型
在之前分析过了Object可以接收任意对象,因为Object是所有类的父类,但是Object并不局限于此,Object类可以接收所有引用类型,包括:类、数组、接口
使用Object来接收数组对象
范例:
public class Test {
public static void main(String[] args) {
//Object接收数组对象,向上转型
Object obj=new int[]{1,2,3,4};
//向下转型,需要强转
int []data=(int[])obj;
for(int x:data) {
System.out.print(x + " ");
}
}
}
使用Object来接收接口
范例:
interface IMessage{
void test();
}
class MessageImp1 implements IMessage{
public void test(){
System.out.println("HL");
}
}
public class Test {
public static void main(String[] args) {
//子类向父接口转型
IMessage msg=new MessageImp1();
//接口向Object转型
Object obj=msg;
System.out.println(obj);
}
}
Object真正达到了参数的统一,如果一个类希望接收所有的数据类型,就是用Object完成。