Object是Java默认提供的一个类,可以这么说,java里面除了Object类之外,所有的类都是存在有继承关系的。那么默认继承Object父类,也就是说以下的两种类的定义最终效果是完全相同的
class Message { } | class Message extends Object{ } |
那么也就证明:所有类的对象都可以使用Object进行接收
class Message{}
class Person{}
public class TestDemo {
public static void main(String[] args) {
fun(new Message());
fun(new Person());
}
public static void fun(Object obj) {
System.out.println(obj);
}
}Object类的基本概念.Message@10dea4e
Object类的基本概念.Person@647e05
所以在开发之中Object类是参数的最高统一类型。
但是Object本身也具备有一些定义的方法:
No | 方法名称 | 类型 | 描述 |
1 | public Object() | 构造 | 无参构造是专门为子类提供服务的 |
2 | public String toString() | 普通方法 | 取得对象信息 |
3 | public Boolean equals(Object obj) | 普通 | 对象比较 |
对于整个Object类中的方法需要时间一点点来消化。
必须掌握Object类中的每个方法
···········································
取得对象信息
在使用对象直接输出的时候发现默认情况下输出的是一个地址编码。但是如果现在使用的是一个String类,该类对象直接输出的时候就是内容,主要的原因就是toString()方法的问题
范例:观察String类对象的输出
class Person{
private String name;
private int age;
public Person(String name,int age) {
this.age=age;
this.name=name;
}
}
public class TestDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
fun("hellow");//String是Object的子类
fun(new Person("张三",20));
}
public static void fun(Object obj)
{
System.out.println(obj);
}
}//结果 hellow
Person@10dea4e
/*当输出语句改为*/ System.out.println(obj.toString());
结果一样 。所以默认输出对象调用的就是toString()方法
现在就发现了,默认情况下Object类中提供的toString()方法只能够得到一个对象的地址(而这是所有对象都共同具备的特征)。
而现在如果觉得默认给出的toString()功能不足,就建议在需要的子类上覆写toString()方法。
范例:取得对象信息
class Person{
private String name;
private int age;
public Person(String name,int age) {
this.age=age;
this.name=name;
}//增加如下两行进行覆写
public String toString() {//覆写Object类中的方法
return "姓名:"+this.name+" 、 年龄"+this.age;
}
}
public class TestDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
fun("hellow");//String是Object的子类
fun(new Person("张三",20));
}
public static void fun(Object obj)
{
System.out.println(obj.toString());
}
}
结果为:hellow姓名:张三 、 年龄20
所以toString()核心目的在于取得对象信息。相当于替换了之前简单java类之中的getInfo()方法的功能。
提醒:String是作为信息输出的重要的数据类型,
在Java中所有的数据类型只要遇见String,并且执行了“+”这种连接操作,
那么都要求将其变为字符串之后连接,而且所有对象要想变为字符串就默认使用toString()方法。
class Person{
private String name;
private int age;
public Person(String name,int age) {
this.age=age;
this.name=name;
}
public String toString() {//覆写Object类中的方法
return "姓名:"+this.name+" 、 年龄"+this.age;
}}
public class TestDemo {
public static void main(String[] args) {
String result ="Hello"+ new Person("张三",20);//见到String都向String转型不管是什么 。全部
System.out.println(result);
}
}
结论:字符串是王道。对象比较
String类内容的比较使用的是equals()方法,
实际上这个equals()方法就是String类覆写Object类的方法。
·String类中的equals():public boolean equals(Object obj);
以后再编写对象比较的处理,不要再使用之前的compare()了,统一更换为equals().
范例:实现对象比较
class Person{
private String name;
private int age;
public Person(String name,int age) {
this.age=age;
this.name=name;
}
public boolean equals(Object anObject) {
/*Object是Person的父类 并不知道子类的属性所以需要把Object进行向下转型。
* */
if(anObject==null) {
return false;
}
if(this==anObject) {
return true;
}
if(!(anObject instanceof Person)) {
return false;//判断传参是否和Person类对象是同一类型
}
//必须将Object类型变为Person类型后才能调用name和age属性
Person per=(Person) anObject;
return this.name.equals(per.name)&&this.age==per.age;
}
public String toString() {//覆写Object类中的方法
return "姓名:"+this.name+" 、 年龄"+this.age;
}
}
public class TestDemo {
public static void main(String[] args) {
Person per1=new Person("张三",20);
Person per2=new Person("张三",20);
System.out.println(per1.equals(per2));
}
}//结果为true
当没有if(!(anObject instanceof Peron)) 并且equals方法传入一个字符串时,
就会出现ClassCastException异常
但是需要有一个注意,很多人再写对象比较的时候会使用如下的实行:
· public boolean equals(Person anObject)
因为父类中的equals()方法用的是Object,所以以上的方法严格来讲已经不叫覆写了,叫重载