【4】java之基础数据类型的包装类
一、认识包装类
java 在设计之初有一个基本原则:一切皆对象,一切的操作都基于对象,但是有一个矛盾,基本数据类型不是对象。为了符合于这种要求,最早使用人为的方式解决此问题,如下所示:
class MyInt{
private int num; // 这个类包装的基本数据类型
public MyInt(){}
public MyInt(int num){ // 构造的目的是将基本数据类型传递给对象,相当于将基本类型进行包装。
this.num = num;
}
public int intValue(){ // 将包装的数据内容返回,相当于拆包。
return this.num;
}
}
public class TestDemo{
public static void main(String args[]){
MyInt mi = new MyInt(10);
int temp = mi.intValue()*2;
System.out.println(temp);
}
}
在 Java 里为了方便用户的使用,专门提供了一组包装类,来包装所有的基本数据类型: byte(Byte)、short(Short)、int(Integer)、long(Long)、float(Float)、double(Double)、char(Character)、boolean(Boolean)。
以上给出的包装类又分为两种子类型:
- 对象型包装类(Object 直接子类):Character、Boolean
- 数值型包装类(Number 的直接子类):Byte、Short、Integer、Long、Float、Double。
Number 是一个抽象类,里面一共定义了6个方法:byteValue()、intValue()、shortValue()、longValue()、floatValue()、doubleValue()。
二、装箱与拆箱
现在已经存在基本数据类型与包装类,那么这两种变量间的转换就通过以下方式定义:
- 装箱操作:将基本数据类型变成包装类,每个包装类的构造方法都可以接收各自数据类型的变量。
- 拆箱操作:从包装类中取出被包装的数据,利用 Number 类中提供的一系列的 xxxValue()方法。
范例:使用 int 和 Integer
public class TestDemo{
public static void main(String args[]){
Integer obj = new Integer(50);
int temp = obj.intValue()*2;
System.out.println(temp);
}
}
之前所编写的 MyInt 类,现在换成了 Integer 这个系统类。
范例:使用 double 和 Double。
public class TestDemo{
public static void main(String args[]){
Double obj = new Double(50.0);
double temp = obj.doubleValue();
System.out.println(temp);
}
}
范例:使用 boolean 和 Boolean.
public class TestDemo{
public static void main(String args[]){
Boolean obj = new Boolean(false);
boolean temp = obj.booleanValue();
System.out.println(temp);
}
}
现在可以发现,所有的包装类都使用了同样形式的方法进行操作。在 JDK 1.5之前能够使用的操作都是以上形式的代码,但是在 JDK 1.5 之后,Java 为了方便开发,提供了自动装箱和拆箱的机制,并且可以直接利用包装类的对象进行数学计算。
范例:自动装箱与自动拆箱
public class TestDemo{
public static void main(String args[]){
Integer obj = 10; // 自动装箱
int temp = obj; // 自动拆箱
obj ++; // 包装类直接进行数学计算
System.out.println(temp * obj);
}
}
范例:
public class TestDemo{
public static void main(String args[]){
Boolean flag = true;
if(flag){
System.out.println("Hello World!");
}
}
}
如果可以直接使用包装类进行计算,就省略了手工的拆箱部分。
注意:在 Integer 类对象上可以直接赋予内容,也可以使用构造方法,这两者有什么区别呢?
public class TestDemo{
public static void main(String args[]){
Integer obja = 10;
Integer objb = 10;
Integer objc = new Integer(10);
System.out.println(obja == objb); // true
System.out.println(obja == objc); // false
System.out.println(objb == objc); // false
}
}
在使用包装类的时候很少会利用构造方法完成,几乎都是直接赋值(这一点和 String 相似),但是在判断内容是否相等的时候请一定要用 equals() 方法。
public class TestDemo{
public static void main(String args[]){
Integer obja = 10;
Integer objb = 10;
Integer objc = new Integer(10);
System.out.println(obja == objb);
System.out.println(obja.equals(objc));
System.out.println(objb.equals(objc));
}
}
提示: 此时 Object 可以统一天下了。Object 可以接收一切的引用数据类型,但是由于存在有自动装箱机制,那么 Object 可以接收基本数据类型了。
- 基本数据类型 —— 自动装箱(成为对象)—— 向上转型
public class TestDemo{
public static void main(String args[]){
Object obj = 10; // 先包装再转换
int temp = (Integer) obj; // 向下变成 Integer 再自动拆箱
System.out.println(temp);
}
}
有了这一系列自动装箱和拆箱的支持后,在数据类型的选择上就方便了许多。
三、数据类型转换(核心)
使用包装类最多的情况实际上是它的数据类型转换功能上,在包装类里提供将 String 类型数据变为基本数据类型的方法,使用几个代表的类来做说明。
- Integer 类:public static int parseInt(String s);
- Double 类:public static double parseDouble(String s);
- Boolean类:public static boolean parseBoolean(String s);
特别需要注意的是 Character 类里并不存在字符串变为字符的方法。因为 String 类有一个charAt()方法可以根据索引取出字符内容。
范例:将字符串变为 int 类型数据。
public class TestDemo{
public static void main(String args[]){
String str = "123";
int temp = Integer.parseInt(str);
System.out.println(temp*2);
}
}
此时实现了字符串变为基本数据类型的操作。但是在这样的转换中,字符串一定要由数字组成。
范例:错误的代码
public class TestDemo{
public static void main(String args[]){
String str = "hello";
int temp = Integer.parseInt(str);
System.out.println(temp*2);
}
}
范例:观察 double 转换
public class TestDemo{
public static void main(String args[]){
String str = "12.3";
double temp = Double.parseDouble(str);
System.out.println(temp*2);
}
}
范例:观察 boolean 转换
public class TestDemo{
public static void main(String args[]){
String str = "true";
boolean flag = Boolean.parseBoolean(str);
if(flag){
System.out.println("true");
}else{
System.out.println("false");
}
}
}
在 Boolean 进行转换的过程里,如果要转换的字符不是 true 默认转换结果都是 false。
现在既然实现了字符串变为基本数据类型的操作,那么也一定可以实现基本数据类型变成字符串的操作。有两种做法:
- 操作一:任何基本数据类型与字符串使用了“+”操作后,都表示变成字符串。
public class TestDemo{
public static void main(String args[]){
int temp = 10;
String str = temp + "";
System.out.println(str);
}
}
这样的操作虽然可以简单的完成,但是会存在有垃圾问题。
- 操作二:String 类方法 public static String valueOf(数据类型 变量)
public class TestDemo{
public static void main(String args[]){
int temp = 10;
String str = String.valueOf(temp);
System.out.println(str.replaceAll("0","9"));
}
}
这样的转换不会产生垃圾,所以在开发时往往使用后者做法。
四、总结
1、JDK 1.5 之后才提供自动装箱和拆箱操作;
2、字符串与基本数据类型的互相转换:
- 字符串变为基本数据类型,依靠包装类的 parseXXX()方法;
- 基本类型变成字符串,依靠 String.valueOf(数据类型 变量)方法。
【4】java之基础数据类型的包装类的更多相关文章
- Java中基本数据类型和包装类
参考:深入剖析Java中的装箱和拆箱; Java中基本数据类型和包装类互转中 缓冲机制的使用; java学习笔记:装箱和拆箱,包装器和缓冲池 Java 各 类型数据在内存中分配情况详解 一 java内 ...
- java.lang基础数据类型boolean、char、byte、short、int、long、float、double (JDK1.8)
java.lang.Boolean public static int hashCode(boolean value) { return value ? 1231 : 1237; } JDK 1.8新 ...
- Java SE-基本数据类型对应包装类
包装类 Java是面向对象的编程语言,包装类的出现更好的体现这一思想. 其次,包装类作为类是有属性有方法的,功能比基本数据类型要强大. [八种基本数据类型的包装类] byte ——Byte short ...
- Java - 关于基础数据类型的形参和返回值
1. 当基础数据类型被当作形参时,最好使用其包装类,因为这样可方便调用者传参(基础数据类型亦或是其包装类都可) 2. 当基础数据类型被当作返回值时,最好使用原型,因为这样可以方便调用者接收返回值( ...
- java之基础数据类型学习————(一)
JAVA数据类型: 总结来说,java的基本数据类型分为 四类八种 • 第一类:整数类型:byte.short.int.long • 第二类:浮点型:float.double • 第三类:字符类型:c ...
- java的基础数据类型
Java 里面的数据类型从大的方面分为两类,一是基本数据类型,一是引用类型.基本的JAVA 数据类型层次图如下: Java 中的基本数据类型可分为四种:(1)逻辑型:boolean(2)文本型:cha ...
- Java基础(34):Java中基本数据类型的包装类(主要为了不同数据类型之间更方便的进行转换)(Wrapper类)
相信各位小伙伴们对基本数据类型都非常熟悉,例如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性的,比如基本类型不能调用方法.功能简单...,为了让基本数 ...
- Java基础-数据类型和包装类
数据类型 分为基本数据类型和引用数据类型 基本数据类型变量存储的就是数据本身,引用数据类型的变量是保存数据的空间地址 四种基本数据类型: 逻辑型 boolean 文本型 char 整数型 byte s ...
- JAVA语法基础——数据类型
---恢复内容开始--- JAVA数据类型分为:数值型和字符型和布尔型 数值型分为整数型(整型)和浮点型(小数点), 整型分为四种,byte比特型.short型.int型.long型. byte是最小 ...
- Java语言基础——数据类型与运算符
标识符: 1.组成元素由字母.数字.下划线.美元符号($) 2.标识符不能以数字开头 3.标识符严格区分大小写 4.标识符的命名要有意义(见名知意) 注释: 1.单行注释 // 2.多行注释 /* 注 ...
随机推荐
- ob_DES_艺恩
网站 aHR0cHM6Ly93d3cuZW5kYXRhLmNvbS5jbi9Cb3hPZmZpY2UvQk8vWWVhci9pbmRleC5odG1s 抓包返回密文 点到initator,PostA ...
- Azure DevOps 的架构窥探
工作的缘故,接触 TFS (Team Foundation Server)挺多的,现在改名为 Azure DevOps,分为 可私有化部署版本 Azure DevOps Server,简称ADS,以及 ...
- BZOJ4919 大根堆(树形dp+线段树合并)
用 multiset 启发式合并贪心维护 LIS 的做法就不多说了,网上题解一大堆,着重讲一下线段树合并维护 \(dp\). \(O(n^2)\) 的 \(dp\) 非常显然.离散化后,设 \(dp[ ...
- python之路46 django request对象 form表单 pycharm连接数据库 ORM简介
静态文件配置 1.编写一个用户登录页面 2.静态文件 不怎么经常变化的文件 主要针对html文件所使用的到的各种资源 css文件.js文件.img文件.第三方框架文件 django针对静态文件资源需要 ...
- rvm安装ruby
macOS11.1 打开终端 使用下面命令查看ruby版本 rvm list known 然后安装 rvm install 2.0.0 查看ruby版本 ruby -v 系统默认使用ruby版本 ...
- 在GCP上创建GCE的三种方式(Console,gcloud,Terraform)
1 简介 如果要选择GCP为云平台,则经常需要创建GCE(Google Compute Engine),有以下几种方式: (1) 在浏览器创建 (2) 命令 gcloud (3) Terraform ...
- odoo中的字段创建后,不可以编辑
- NodeJS 实战系列:如何设计 try catch
本文将通过一个 NodeJS 程序里无效的错误捕获示例,来讲解错误捕获里常见的陷阱.错误捕获不是凭感觉添加 try catch 语句,它的首要目的是提供有效的错误排查信息,只有精心设计的错误捕获才有可 ...
- 如何通过Java应用程序添加或删除 PDF 中的附件
当我们在制作PDF文件或者PPT演示文稿的时候,为了让自己的文件更全面详细,就会在文件中添加附件.并且将相关文档附加到 PDF 可以方便文档的集中管理和传输.那么如何添加或删除 PDF 中的附件呢?别 ...
- 一幅图像为f=[1 4 7;2 5 8;3 6 9],设kx=1.8,ky=1.3,试采用最邻近插值对其进行放大,写出新图像矩阵。
一幅图像为f=[1 4 7;2 5 8;3 6 9],设kx=1.8,ky=1.3,试采用最邻近插值对其进行放大,写出新图像矩阵.(请写出解题步骤,并编写程序进行结果验证) 参考 matlab代码如下 ...