Object类和包装类

时间:2021-6-19 作者:qvyue

Object类

什么是Object类

Object类是java中所有类的父类
我们编写的类如果不继承任何类,那么默认继承Object

为什么需要Object类

Object类承载了java中所有类的共性内容为java程序提供了最基本的结构支撑是所有类的根类

重写toString和equals方法

Object类中的方法并不能针对子类编写
子类中可以重写超类的方法
那么我们编写的类也可以重写Object类中的方法,以达到我们期望的业务或功能对Object类中的toString和equals方法重写是比较常见的。

package day02;
/**
 * 使用Point来测试作为Object子类时重写Object
 * 相关方法的准则.
 * @author adminitartor
 *
 */
public class Point {
    private int x;
    private int y;
    
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    /**
     * 重写toString
     * 通常使用一个类的toString就应当重写这个方法。
     * 返回的是一个字符串,该字符串格式可根据实际
     * 开发时的需求而定。
     * 原则上该字符串应当包含当前实例的属性信息。
     */
    public String toString(){
        return "(" + x + "," + y + ")";
    }
    
    /**
     * 重写Object提供的equals方法
     * 原则:按照实际设计需求而定,比较所有要求比较的
     * 属性,但不是必须所有属性值都一样才算作true.
     */
    public boolean equals(Object obj){
        if(obj == null){
            return false;
        }
        if(obj == this){
            return true;
        }
        if(obj instanceof Point){
            Point p = (Point)obj;
            return this.x==p.x&&this.y==p.y;
        }
        return false;
    }
}
  • 测试类:
package day02;
/**
 * 使用该类测试Point重写Object的相关方法
 * @author adminitartor
 *
 */
public class TestPoint {
    public static void main(String[] args) {
        Point p = new Point();
        p.setX(1);
        p.setY(2);
        /*
         * 当使用一个类的toString方法时,就应当重写
         * 该方法,因为Object提供的toString格式为:
         * 类名@地址
         * 这通常对我们了解当前类实例信息没有帮助。
         */
        /*
         * System.out.println(Object o)
         * 该方法会将给定对象toString方法返回的字符串
         * 输出到控制台
         */
        System.out.println(p);//(1,2)
        
        
        
        Point p1 = new Point();
        p1.setX(1);
        p1.setY(2);
        System.out.println(p1);
        
        System.out.println(p==p1);//false
        /*
         * 当我们需要使用一个类的equals方法时,就
         * 需要重写这个方法,因为Object提供的equals
         * 内部是使用"=="比较的。
         * equals设计目的是比较两个对象内容是否一样。
         */
        System.out.println(p.equals(p1));//true
        
    }
}

包装类

什么是包装类

每个基本数据类型对应一个包装类
包装类对象就是基本数据类型的对象形式

Object类和包装类

为什么需要包装类

基本数据类型不能直接参与引用类型的使用或计算
使用包装类将基本数据类型转换为引用数据类型,可以参与到其他引用类型的使用

包装类的使用

包装类是为了解决基本类型不能直接参与面向对象开发问题而产生的,使得基本类型可以以对象的形式存在。

包装类的赋值

package day02;
/**
 * 包装类
 * 8个基本类型由于不能直接参与面向对象开发(因为基本类型
 * 没有面向对象特性:封装,继承,多态)
 * 为此java为8个基本类型提供了包装类。
 * 
 * 其中6个数字类型的包装类都继承自:java.lang.Number
 * Number是一个抽象类,提供了可供数字类型之间相互转换
 * 的相关方法。
 * 
 * @author adminitartor
 *
 */
public class IntegerDemo1 {
    public static void main(String[] args) {
        int a = 1;
//      Integer i1 = new Integer(a);
//      Integer i2 = new Integer(a);
        
        //推荐使用包装类的静态方法valueOf来转换
        Integer i1 = Integer.valueOf(a);
        Integer i2 = Integer.valueOf(a);
        
        System.out.println(i1==i2);//false
        System.out.println(i1.equals(i2));//true
        
        /*
         * 从包装类转换为基本类型
         */
        int ii = i1.intValue();
        System.out.println(ii);
        
        double d = i1.doubleValue();
        System.out.println(d);
        
    }   
}

包装类提供了一些常用功能

package day02;
/**
 * 包装类有一些常用功能 
 * @author adminitartor
 *
 */
public class IntegerDemo2 {
    public static void main(String[] args) {
        //获取int最大值?
        int imax = Integer.MAX_VALUE;
        System.out.println("imax:"+imax);
        
        int imin = Integer.MIN_VALUE;
        System.out.println("imin:"+imin);
        
        //获取long的最大值?
        long lmax = Long.MAX_VALUE;
        System.out.println("lmax:"+lmax);
        
        long lmin = Long.MIN_VALUE;
        System.out.println("lmin:"+lmin);
    }
}

字符串解析为对应的基本类型数据

package day02;
/**
 * 包装类提供了一个非常实用的功能:
 * 可以将字符串解析为对应的基本类型数据,
 * 但是前提是该字符串必须正确描述该基本类型可以
 * 保存的值。
 * @author adminitartor
 *
 */
public class Integer_parseInt {
    public static void main(String[] args) {
        String str = "123";
        int a = Integer.parseInt(str);
        System.out.println(a+1);//124
        
        double d = Double.parseDouble(str);
        System.out.println(d+1);//124.123
    }
}

自动拆装箱

使得编译期在编译期间补充代码完成基本类型与对应的包装类之间转换的代码,使得我们在编写源代码时可以在基本类型与引用类型之间直接赋值。

package day02;
/**
 * JDK1.5之后推出了一个新的特性
 * 自动拆装箱
 * 自动拆装箱特性是编译器认可,而非虚拟机。
 * @author adminitartor
 *
 */
public class IntegerDemo3 {
    public static void main(String[] args) {
        /*
         * 下面的代码会触发编译器的自动装箱特性:
         * 编译器会在编译后的class文件中添加代码,将
         * 基本类型转换为包装类:
         * Integer i = Integer.valueOf(123);
         */
        Integer i = 123;
        /*
         * 下面的代码会触发编译器的自动拆箱特性:
         * 编译器会在变异后的class文件中添加代码,将
         * 包装类转换为基本类型:
         * int in = i.intValue();
         */
        int in = i;
    }
}
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。