通过Object类的学习(《阿里云【名师课堂】Java面向对象开发75 ~ 78:Object类》)我们知道,Object类可以接收所有的引用数据类型。
此时又出现一个问题:数据类型分为基本数据类型和引用数据类型,那么基本数据类型怎么处理?
79:包装类简介
包装类就是将基本数据类型封装在一个类之中,就好比如下的代码:
范例:定义一个包装类
class MyInt {
private int num ;
public MyInt(int num) {
this.num = num ;
}
public int intValue() {
return this.num ;
}
}
这时MyInt
实际上就是一个int型数据的包装类,利用MyInt
可以实现基本数据类型变为对象的需求。
范例:包装类的使用
public class TestDemo {
public static void main(String args[]) {
// 子类对象自动向Object转型,变为父类对象
Object obj = new MyInt(17) ; ;
MyInt temp = (MyInt)obj ; // 取出内容需要向下转型
System.out.println(temp.intValue() * 2) ; // 取出里面的基本数据类型操作
}
}
将基本数据类型包装为一个类对象的本质在于方便的使用Object进行接收处理。但是Java中有8种基本数据类型,如果每种数据类型都按照上述方式编写,会存在如下问题:
- 在开发过程中会有代码重复;
- 在进行数学运算时必须使用明确的方法将包装类中包装的基本数据取出后才可以进行。
为了解决这些问题,Java提供了包装类
,而对于包装类提供有两种类型:
- 对象型类(Object类的直接子类):
Boolean
、Character
; - 数值型类(Number类的直接子类):
Byte
、Double
、Short
、Long
、Integer
、Float
。- Number实际上也是Object的子类,但是在这里我们只考虑Number;
说明:关于Number类
- Number类的定义:
public abstract class Number extends Object implements Serializable
,可以看出Number类是一个抽象类 - Number类中实际上定义六个重要方法,对应六种数据类型:
byteValue()
、doubleValue()
、floatValue()
、intValue()
、longValue()
、shortValue()
- 目的是从包装类中取出被包装的数据的值。
80:装箱与拆箱
在包装类与基本数据类型处理之中存在有两个概念:
- 装箱:将基本数据类型变为包装类对象;
- 利用每一个包装类提供的构造方法实现装箱处理。
- 拆箱:将包装类中包装的基本数据类型取出。
- 利用Number类中提供的一系列
xxxValue()
方法。
- 利用Number类中提供的一系列
范例:观察int型
public class TestDemo {
public static void main(String args[]) {
Integer num = new Integer(17) ; // 装箱
int x = num.intValue() ; // 拆箱
System.out.println(x * 2) ;
}
}
范例:观察double型
public class TestDemo {
public static void main(String args[]) {
Double num = new Double(17.1) ; // 装箱
double x = num.doubleValue() ; // 拆箱
System.out.println(x * 2) ;
}
}
以上写法采用的是手工的装箱与拆箱处理操作形式,这种做法在JDK1.5之前使用。JDK1.5之后提供有自动装箱与拆箱的机制,最为重要的是,由于此类机制的存在,我们可以直接利用包装类的对象进行各种数学计算。
范例:观察自动装箱与拆箱
public class TestDemo {
public static void main(String args[]) {
Integer x = 17 ; // 自动装箱,变为包装类
System.out.println(++x * 2) ;
// 可以看出,可以直接利用包装类对象操作
}
}
但是这是又出现了新问题:==
和equals()
问题。
范例:观察程序
public class TestDemo {
public static void main(String args[]) {
Integer num1 = 17 ; // 自动装箱,变为包装类
Integer num2 = 17 ; // 自动装箱,变为包装类
System.out.println(num1 == num2) ;
System.out.println(num1 == new Integer(17)) ;
System.out.println(num1.equals(new Integer(17))) ;
}
}
无需特别关注,以后绝大多数情况还是使用equals()方法。
经过包装类的学习,需要明确一个选择:使用int
还是Integer()
?
- 在接收数据时使用的一定都是int,而保存数据时会使用
Integer()
;- int型数据默认为0,Integer类的对象默认值mull,当需要进行数据库操作时外键不能为0,这时候就需要Integer。先了解,以后会学到。
- 以后编写简单Java类时统一用
包装类
取代基本数据类型
,只有单纯描述一个数字时用int(如循环条件之类)。
范例:观察默认值
public class TestDemo {
public static void main(String args[]) {
int num1 = 0 ;
Integer num2 = null ;
System.out.println(num1) ;
System.out.println(num2) ;
}
}
81:字符串与基本数据类型转换
字符串变为基本数据类型
以后如果需要进行数据的输入,输入的类型一定是字符串。所以在开发中有这样的需求:如何将字符串转换为基本数据类型。这个操作需要包装类支持。
常用三种方法:
- String变为int类型(Integer类中的方法):
public static int parseInt(String s)
; - String变为double类型(Double类中的方法):
public static double parseDouble(String s)
; - String变为boolean类型(Boolean类中的方法):
public static boolean parseBoolean(String s)
; - String类没有变为char类的方法,因为字符串不能变为字符。
范例:观察字符串与int、double的转换
public class TestDemo {
public static void main(String args[]) {
String str = "147" ;
int num1 = Integer.parseInt(str) ; // 字符串变为int型
double num2 = Double.parseDouble(str) ; // 字符串变为double型
System.out.println(str) ;
System.out.println(num1 * 2) ;
System.out.println(num2) ;
}
}
- 但是如果字符串中有非数字元素,该字符串转换为数字类型时会报错(
NumberFormatException
)。
范例:观察字符串与boolean的转换
public class TestDemo {
public static void main(String args[]) {
String str = "true" ;
boolean flag = Boolean.parseBoolean(str) ;
System.out.println(str) ;
System.out.println(!flag) ;
}
}
- 当字符串内容不是
true
时,其他任何内容转换为boolean
类型输出都会是false。
public class TestDemo {
public static void main(String args[]) {
String str = "agbas" ;
boolean flag = Boolean.parseBoolean(str) ;
System.out.println(str) ;
System.out.println(flag) ; // false
}
}
重点在于字符串转其他数据类型中的三种常用方法。
基本数据类型变为字符串
- 任何基本数据类型使用
+
连接上任意字符串(空白字符串也可以)就会变成字符串类型。 - String类中提供有valueOf()方法可以进行转换
public class TestDemo {
public static void main(String args[]) {
String str1 = String.valueOf(\'A\') ; // 字符转换为字符串
String str2 = String.valueOf(147) ; // int型转换为字符串
String str3 = String.valueOf(147.0) ; // double型转换为字符串
System.out.println(str1.length()) ; // 如果可以调用length()方法说明是字符串
System.out.println(str2.length()) ;
System.out.println(str3.length()) ;
}
}