Object类、包装类

Object类

1.定义

Object类是所有类的父类,所有类默认继承Object类。即所有类的对象都可以使用Object进行接收。
Object类可以接收所有引用类型,包括接口和数组。
Object类是参数的最高统一类型。

2. 获取对象信息

在使用对象直接输出的时候,默认输出的是一个地址编码。如果现在使用的是String类,该类对象直接输出的是内容,主要原因就是toString()方法的问题。
toString():取得对象信息
System.out.println ( )系统输出输出对象时,默认会调用该对象的 toString()
若自定义类需要进行内容的输出,需要覆写 toString()

范例:覆写toString()方法

class Person{
    private String name ;
    private int age ;
    public Person(String name, int age) {
        this.age = age ;
        this.name = name ;
    }

    @Override
    public String toString() {
        return "姓名:"+this.name+",年龄:"+this.age ;
    }
}
class Student{}
public class Test {
    public static void main(String[] args) {
        fun(new Person("yuisama",25) );
        fun("Hello");
    }
    public static void fun(Object obj) {
        System.out.println(obj.toString()); // 默认输出对象调用的就是toString()方法
    }
}

toString()的核心目的在于取得对象信息。
String作为信息输出的重要数据类型,在Java中所有的数据类型只要遇见了String并且执行了 + ,那么都要求将其变为字符串后连接,而所有对象要想变为字符串就默认使用 toString() 方法。

3.对象比较

String类对象的比较使用的是equals()方法,实际上String类的equals()方法就是覆写的Object类中的equals()方法。

equals():比较两个对象内容
Object类提供的equals默认比较两个对象的地址是否相同。

------equals方法的覆写------

public boolean equals(Object obj){
    //判断地址是否相等
    if (obj == this) {
        return true;
    }
    //判断传进来的对象不是Person对象
    if (!(obj instanceof Person)){
        return false;
    }
    //此时需要比较两个Person对象的内容
    //需要向下转型转回Person对象后比较两者属性的内容
    Person per = (Person) obj;
    return this.age == per.age
         &&this.name.equals(per.name);   
}

4.接收引用数据类型

Object类可以接收所有引用类型,包括接口和数组。

范例:使用Object来接受数组对象

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.println(i+"、");
    }
}

Object可以接收接口是Java中的强制要求,因为接口本身不能继承任何类。
范例:使用Object接收接口对象

interface IMessage {
    public void getMessage() ;
}
class MessageImpl implements IMessage {
    @Override
    public String toString() {
        return "I am a student" ;
    }
    public void getMessage() {
        System.out.println("比特欢迎你");
    }
}
public class Test {
    public static void main(String[] args) {
        IMessage msg  = new MessageImpl() ; // 子类向父接口转型
        Object obj = msg ; // 接口向Obejct转型
        System.out.println(obj);
        IMessage temp = (IMessage) obj ; // 强制类型转换
        temp.getMessage();
    }
}

结束:Object类是参数的最高统一类型。

扫描二维码关注公众号,回复: 5788621 查看本文章

包装类:将基本类型封装到类中

1.定义

自己定义一个包装类

class IntDemo {
    private int num ;
    public IntDemo(int num) {
        this.num = num ;
    }
    public int intValue() {
        return this.num ;
    }
}

此时IntDemo实际上就是int数据类型的包装类,利用IntValue就可以实现基本数据类型变为对象的需求。

public static void main(String[] args) {
    // 子类对象向上转型
    Object obj = new IntDemo(55) ;
    IntDemo temp = (IntDemo) obj ; // 向下转型
    System.out.println(temp.intValue()); // 取出里面的基本数据类型操作
}

结论:将基本数据类型包装为一个类对象的本质就是使用Object进行接收处理。
Java为了方便开发,专门提供了包装类的使用,
而对于包装类的使用,提供了两种类型。如下:

数值型(Number的子类):Byte、Short、Integer(int)、Long、Float、Double
对象型(Object的子类):Boolean、Character(char)

2.装箱与拆箱

装箱:将基本数据类型变为包装类对象,通过每个包装类的构造方法来实现装箱处理。
拆箱:将包装类中包装的基本数据类型取出,利用包装类提供的xxValue()方法
Integer提供的 intValue();
范例:以int和Integer举例

Integer num = new Integer(55) ; // 装箱
int data = num.intValue() ; // 拆箱
System.out.println(data);

自动拆装箱:
使用包装类与使用基本类型在用法上基本一致

// 自动装箱
Integer x = 55 ;
// 可以直接利用包装类对象操作
System.out.println(++x * 5 );

用基本类型还是包装类?
1.【强制】所有POJO类(类中只有属性与getter/setter,构造方法)使用包装类。
2.局部变量推荐使用基本类型

----包装类进行数值比较使用equals方法----
说明:
对于Integer var = ? 直接赋值在 [-128~127] 区间内的赋值,Integer 对象在缓存池产生,会复用已有对象。在这个区间外的所有数据均在堆上产生,并且不会复用已有对象。

3.String 与基本类型的相互转化

String ->基本类型

使用各个包装类提供的parseXX()方法。

比如:Integer . parseInt (str);

当字符串中包含了非数字,在运行时会抛出 NumberFormatException 错误

基本类型->String

  1. 任何数据类型使用了"+"连接空白字符串就变为了字符串类型。
  2. 通过String的构造方法
  3. 使用String类中提供的valueOf()方法,此方法不产生垃圾。

猜你喜欢

转载自blog.csdn.net/qq_42711862/article/details/88719905