Java基础----Object 类、包装类



文章目录

  • Java基础----Object 类、包装类
  • 一、Object 类
  • Object 类简介
  • Object 类中的方法
  • 获取对象信息:toString()
  • 对象比较:equals()
  • Object 类中的其他方法
  • 二、包装类
  • 包装类简介
  • 装箱与拆箱操作
  • 数据转换
  • 字符串类型转换
  • 一、“+”自动转换
  • 二、在String 类中提供了专门的方法


一、Object 类

Object 类简介

  Object是一个系统类,没有继承结构,一切的类都是Object的子类,在Java中,只要定义了类,那么这个类就默认是Object的子类。

class Ball{}  ==  class Ball extends Object{}

  上述两种定义方式效果相同,因为Object是所有类的父类,那么Object可以接受所有子类的实例。
  obj接收子类实例,无法实现子类扩充方法,必须通过向下转型才可以实现。如下示例:

Object obj = new Ball();    //向上转型
Ball ball = (Ball)obj; 	//向下转型

  Object是一个功能强大的父类,能够接收所有的引用数据类型(数组、类、接口),例如使用Object接收数组。

Object obj = new int[]{1,2,3};    //向上转型

Object 类中的方法

获取对象信息:toString()

  Object除去他是所有类的父类这一强大性质外,本质上Object还是一个普通的类,类中也有许多方法,其中有一个获取对象信息的方法:
  · 获取对象信息:public String toString(){}
  在输出对象的时候,就要调用toString方法,在Object类中默认的toString()方法能够返回的只是一个实例化对象的地址,因为他要考虑所有子类的适应性,所以默认输出的都是子类的实例化地址,但toString也是可以依据使用进行覆写的。

对象比较:equals()

  类属于引用数据类型,不同的类依靠对象来使用,传统的“= =” 比较方式实现的是两个对象地址的比较,Object类中提供了一个比较的方法equals();这个方法在String中可以方便的进行字符串的比较,正式覆写了Object类中的方法实现的。
  在自定义类中使用equals()比较两个对象时,equals方法的默认实现是"=="运算符,即比较两个对象的引用地址,而不是比较对象的内容。
示例:使用标准的结构进行对象比较:
//对象比较

class Ball {
    private String classify;
    private int price;
    public boolean equals(Object obj) {
        if(!(obj instanceof Ball) ){
            return false;
        }
        if(this == obj){
            return true;
        }
        if(obj==null){
            return false;
        }
        Ball ball = (Ball)obj;
        return ball.classify.equals(this.classify)&&this.price == ball.price;
    }
}

  Object类中的equals()方法是实现对相比较的标准方法名称,在需要的子类上覆写此方法即可实现比较操作。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

Object 类中的其他方法

  · getClass().getName()代表返回对象所属类的类名。

  · hashCode()代表返回该对象的哈希值。

  · Integer.toHexString(hashCode())代表将对象的哈希值用16进制表示。

二、包装类

包装类简介

  Object类型可以保存所有的引用数据类型,当JDK1.5之后,Object可以保存所有的基本数据类型,通过包装类来实现。
  基本数据类型与引用数据类型最大的区别在于:基本数据类型采用的是数值传递,而引用数据类型采用的是地址传递,如果想要基本数据类型可以像引用数据类型那样进行处理,JDK为了解决基本类型与Object类之间的接收问题,提供了系统内置的包装类,系统包装类一共有八个:Byte、Short、Integer、Long、Float、Double、Character、Boolean。这八个包装类又分为两组:
  · 对象型包装类:Character、Boolean;
  · 数值包装类:Byte、Short、Integer、Long、Float、Double。
  其中所有的数值型的包装类都属于Number子类,Number是一个抽象类,其内部提供有如下的抽象方法:

1.public byte byteValue();
2.public short shortValue()
3.public abstract int intValue()
4.public abstract long longValue()
5.public abstract float floatValue()
6.public abstract double doubleValue()

装箱与拆箱操作

  包装类的基本概念知道了之后,可以进行包装类与基本数据类型之间的类型转换,这样的转换操作成为装箱与拆箱。
  · 装箱:将基本数据类型变为包装类的形式出现,一般通过构造方式完成;
  · 拆箱:加固包装类中的内容取出,方法一般是:***Value()。

Integer obj = new Integer(26);
int num = obj.intalue();

  在JDK1.5以后为包装类提供了重要的功能:自动装拆箱,在JDK1.5以前,所有的包装类对象都必须手动调用构造方法才可以实现装箱操作,然后必须用Number类中的方法进行拆箱处理操作。
让我们来观察一下自动装拆箱的操作:
代码如下(示例):

public class Test01{
	public static void main(String args[]){
		Integer obj = 26;	//自动装箱
		//此时编译器执行了Integer obj = Integer.valueOf(26)
		int num = obj;	//自动拆箱
		//自动拆箱,实际上执行了 int num = obj.intValue()
		System.out.print(num);
	}
}

输出结果:D:\java\jdk-11\bin\java.exe "-javaagent:D:\IDEA\IntelliJ IDEA 2018.3.2\lib\idea_rt.jar=53698:D:\IDEA\IntelliJ IDEA 2018.3.2\bin" -Dfile.encoding=UTF-8 -classpath D:\JavaTest\out\production\Test01 zhang.da.pao.Test01
26
Process finished with exit code 0

  查看一下valueOf的源码:

public static Integer valueOf(int i) {
     assert IntegerCache.high>= 127;
     if (i >= IntegerCache.low&& i <= IntegerCache.high)
     return IntegerCache.cache[i+ (-IntegerCache.low)];
     return new Integer(i); 
}

  该方法返回一个 Integer 对象,只是在返回之前,作了一个判断,判断当前 i 的值是否在 [-128,127] 区间范围内,且 IntegerCache 中是否存在此对象,如果存在,则直接返回引用,否则,创建一个新的对象。
  Object作为一个重要的参数类型,利用这种自定的装箱与拆箱机制可以进行基本数据类型的直接接收

public class Test01{
    public static void main(String args[]){
        Object obj = 2.6;	//自动装箱
        double num = (Double)obj;	//自动拆箱
        System.out.print(num);
    }
}

输出结果:D:\java\jdk-11\bin\java.exe "-javaagent:D:\IDEA\IntelliJ IDEA 2018.3.2\lib\idea_rt.jar=53533:D:\IDEA\IntelliJ IDEA 2018.3.2\bin" -Dfile.encoding=UTF-8 -classpath D:\JavaTest\out\production\Test01 zhang.da.pao.Test01
2.6
Process finished with exit code 0

  这样Object真正意义上实现了接受全部数据类型参数统一的功能。

数据转换

  包装类中还有一个重要的功能:就是进行数据的转换处理,可以将字符串类型的数据转变为基本数据类型,例如:

//Integer类
public static int parseInt(String str);
//Double类
public static void parseDouble(String str);
//Boolean类
public static void parseBoolean(String str);

  需要说明的是,如果在parseBoolean()中传入的参数不是"true"或是"false"字符串的话,均按照false来处理。

字符串类型转换

  字符串可以利用包装类变成基本数据类型,同样,基本数据类型也可以变为字符串类型。

一、“+”自动转换

  任何基本数据类型加上“+”都会自动转换为字符串类型。
  但是Java中任意使用双引号定义的内容都是字符串的匿名对象,此类操作实际上会产生垃圾空间。

二、在String 类中提供了专门的方法
public static String valueOf(任意数据类型 obj);

  此种方式不会产生垃圾空间。