Object
1.Object简述
Object是Java默认提供的一个类。Java里除了Object类,所有的类都是存在继承关系的,默认会继承Object父类,也就是说,所有类的对象都可以用Object来接收。如下
class Person{};
class Student{};
public class P1 {
public static void main(String[] args) {
fun(new Person());
fun(new Student());
}
public static void fun(Object obj){
System.out.println(obj);
}
}
//输出
//Person@1b6d3586
//Student@4554617c
所以在开发中,Object类是最高的参数统一化,同时Object类中存在一些定义好的方法,如下
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
1. | public Object() | 构造 | 无参构造为子类服务 |
2. | public String toString() | 普通 | 取得对象信息 |
3. | public boolean equals(Object obj) | 普通 | 对象比较 |
2.取得对象信息
在使用对象直接输出的时候,默认输出的是一个地址编码,如果现在使用的是String类,该类对象直接输出的是内容,如下
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("xiaokeai",18));//Person@1b6d3586
fun("Hello");//Hello
}
public static void fun(Object obj){
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.name = name;
this.age = age;
}
@Override
public String toString(){
return "名字:" + this.name + " 年龄:" + this.age;
}
}
public class test{
public static void main(String[] args) {
fun(new Person("xiaokeai",18));//名字:xiaokeai 年龄:18
fun("Hello");//Hello
}
public static void fun(Object obj){
System.out.println(obj.toString());//默认输出对象调用的就是toString()方法
}
}
toString()方法的核心目的在于取得对象信息。而String作为信息输出的重要数据类型,在Java中所有的数据类型只要遇见String并执行了“+”,那么都要求将其变为字符串后连接,而所有对象想要变成字符串就要使用toString()方法
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;
}
}
public class test{
public static void main(String[] args) {
String msg = "Hello" + new Person("xiaokeai",18);
System.out.println(msg);//Hello名字:xiaokeai 年龄:18
}
}
3.对象比较
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;
}
//是当前类对象
//向下转型比较属性值
Person person = (Person)obj;
return this.name.equals(person.name) && this.age == person.age;
}
}
public class test{
public static void main(String[] args) {
Person per1 = new Person("zoujier",18);
Person per2 = new Person("zoujier",18);
System.out.println(per1.equals(per2));
}
}
4.接收引用数据类型
Object是所有类的父类,它的特点不仅限于此,他可以接收所有数据类型,包括:类、数组、接口。
//使用Object来接收数组对象
public class test{
public static void main(String[] args) {
//object接收数组对象,向上转型
Object obj = new int[]{1,2,3,4,5,6};
//向下转型,需要强转
int[] data = (int[])obj;
for(int i = 0;i < data.length; i ++){
System.out.println(data[i]);
}
}
}
//输出结果
//1
//2
//3
//4
//5
//6
Object接收接口是Java中的强制要求,因为接口本身不继承任何类。
//使用Object接收接口对象
interface IMessage{
public void getMessage();
}
class MessageImpl implements IMessage{
@Override
public String toString(){
return "i am father";
}
public void getMessage(){
System.out.println("我是大帅哥");
}
}
public class test{
public static void main(String[] args) {
//子类向父接口转型
IMessage msg = new MessageImpl();
//接口向Object转型
Object obj = msg;
System.out.println(obj);
//强制转换类型
IMessage temp = (IMessage) obj;
temp.getMessage();
}
}
//输出
//i am father
//我是大帅哥
Object真正达到了参数统一,如果一个类希望接收所有的数据类型就是用Object完成。