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);此种方式不会产生垃圾空间。
















