三个特殊类——Object类:
一、Object类介绍:
- Object类是Java默认提供的一个类;
- 在Java中,除了Object类,其他所有的类都存在着继承关系,默认继承的类是Object类;
- 所有类的对象都可以使用Object类接收;
- 在开发中,Object类是参数的最高统一类型(实现了参数统一化,也就是说所有类都可以通过向上转型变为Object类);
[示例1]:
使用Object类接收所有类的对象
class Person{}
class Student{}
public class Test{
public static void main(String[] args){
fun(new Person());
fun(new Student());
}
public static void fun(Object obj){
System.out.println(obj);
}
}
1.1 在Object类中已经实现好的方法:
二、取得对象信息(toString()方法):
<1>、在使用对象直接输出的时候,默认输出的是一个地址编码;如果使用的是String()类,该类对象直接输出内容,因为String类重新覆写了toString()方法,实例如下:
class Person{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
}
public class test2{
public static void main(String[] args) {
//调用了类的对象——默认输出地址编码
fun(new Person("zhangsan",20));
//调用String类对象——直接输出内容
fun("hello");
}
public static void fun(Object obj){
//取得对象内容:
//系统会默认调用对象的toString()方法,所以写与不写效果一样。
System.out.println(obj.toString());
//System.out.println(obj);
}
}
输出结果:
<2>、通过上面的代码,会发现Object类提供的toString()方法默认得到的是一个对象的地址(注意:所有类的对象调用toString()方法得到的都是一个地址编码),如果认为默认的toString()方法功能不足,可以通过在需要的子类中覆写toString()方法,比如想要得到的是对象内容,而不是地址,示例代码如下:
class Person{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
//在子类中覆写toString()方法,为了得到想要的效果:
public String toString(){
return "姓名:"+name+"; 年龄:"+age;
}
}
public class test2{
public static void main(String[] args) {
fun(new Person("zhangsan",20));
fun("hello");
}
public static void fun(Object obj){
//此时调用的就是覆写之后的toString()方法:
System.out.println(obj.toString());
}
}
输出结果:
[小总结]:
toString()的核心目的在于取得对象信息!
<3>、String作为信息输出的重要数据类型,在Java中所有的数据类型只要遇见了String并且执行了"+",那么就会将其变为字符串后进行拼接。而所有对象要想变为字符串默认使用的是toString()方法:
——观察toString()方法:
class Person{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
//在子类中进行toString()方法的覆写:
@Override
public String toString() {
return "姓名是:"+this.name+"; 年龄是:"+this.age;
}
}
public class test2{
public static void main(String[] args) {
String str = "hello"+new Person("张三",20);
fun(str);
}
public static void fun(Object obj){
//打印的是覆写后的toString()方法:
System.out.println(obj.toString());
}
}
[注意]:
如果没有在需要的子类中覆写toString()方法,输出结果就是:
三、对象比较(equals()方法):
<1>、String类对象的比较使用的是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;
}
@Override
public String toString() {
return "姓名是:"+this.name+";年龄是:"+this.age;
}
@Override
public boolean equals(Object obj) {
if(obj == null){
return false;
}
if(this == obj){
return true;
}
//不是Person类对象:
if(!(obj instanceof Person)){
return false;
}
//Object类 > Person类;向下转型,进行属性值的比较:
Person person = (Person) obj;
return this.name.equals(person.name) && this.age == person.age;
}
}
public class test2{
public static void main(String[] args) {
Person per1 = new Person("张三",20);
Person per2 = new Person("张三",20);
System.out.println(per1.equals(per2));
}
}
四、Object接收引用数据类型(类、数组、接口):
<1>、Object类接收数组:
public class test2{
public static void main(String[] args) {
//代码从右往左看:
//Object类接收数组对象,小—>大进行向下转型:
Object obj = new int[]{1,2,3,4,5,6};
//大—>小,向下转型,需要进行强转!
int[] data = (int[]) obj;
for(int i: data){
System.out.print(i+"、");
}
}
}
<2>、Object类接收接口对象:
- 在Java中,Object类接收接口对象是强制要求的,因为接口本身是不继承任何类的!
- Object类真正达到了参数的统一,可以通过使用Object类接收所有的数据类型!
——例如:
interface IMessage{
//在接口中,只声明方法,而是在子类中实现方法体:
public void getMessage();
}
class MessageImpl implements IMessage{
@Override
public String toString() {
return "hello";
}
@Override
public void getMessage() {
System.out.println("world!!!");
}
}
public class test2{
public static void main(String[] args) {
// ① 子类向父类接口转型:
IMessage msg = new MessageImpl();
// ② 接口向Object转型:
Object obj = msg;
//会调用toString()方法:
System.out.println(obj);
// ③
// ‘强制类型转换:
IMessage tmp = (IMessage) obj;
tmp.getMessage();
}
}