Java 从入门到进阶之路(十九)
在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类。
在 Java 中有八个基本类型:byte,short,int,long,float,double,char,boolean,是以值的形式存在的,所以他们并没有面向对象的特征,自然也不继承自 Object,所以不能使用多台,用 Object 的角度去接受基本类型。
假设现在我们有一个计算 1+1 的值,代码如下:
public class Main {
public static void main(String[] args) {
int i = 1 + 1;
System.out.println(i); // Integer integer1 = new Integer(1);
Integer integer2 = new Integer(1);
int integer = integer1.intValue() + integer2.intValue();
System.out.println(integer); // }
} class Integer {
private int i; public Integer(int i) {
this.i = i;
} public int intValue() {
return i;
}
}
在上面的代码中,如果我们想要计算出 1+1 的值,按照之前所学的我们直接利用 int 类型数据 1+1 即可获取,但是我们在上面说了基本类型并不具备面向对象特征,那我们在某些情况下又需要怎么办呢,这就是上面代码中我们自己所写的 integer 类,但是如果我们仅仅是为了计算一个 1+1 ,每次都需要实例化一些 Integer 又太小题大做了。
所以 Java 就很贴心的为八个基本类型封装了一下,并且内置在了 lang 包内,即包装类,所以我们的代码如下也是可以正常运行的:
public class Main {
public static void main(String[] args) {
int i = 1 + 1;
System.out.println(i); // Integer integer1 = new Integer(1);
Integer integer2 = new Integer(1);
int integer = integer1.intValue() + integer2.intValue();
System.out.println(integer); //
}
}
包装类是不可变类,在构造了包装类对象后,不允许更改包装在其中的值,包装类是 final 的,不能定义他们的子类。
在上面的图片中,我们可以看出,数字类型的包装类继承自 Number,char 和 boolean 类型的包装类继承自 Object,接下来我们就举例看一下,如下代码:
/**
* 数字类型的包装类继承自 Number
* 其提供了入:intValue,doubleValue 这样的方法,
* 其作用是将当前包装类表示的数字以其他数字类型的形式返回
* */
public class Main {
public static void main(String[] args) {
/**
* 将基本类型转换成包装类有两种方法:
* 1、调用构造方法
* 2、调用静态方法 valueOf(推荐)
* */
Integer integer1 = new Integer(1);
Integer integer2 = new Integer(1);
System.out.println(integer1 == integer2); // false
System.out.println(integer1.equals(integer2)); // true Integer integer3 = Integer.valueOf(1);
Integer integer4 = Integer.valueOf(1);
System.out.println(integer3 == integer4); // true
System.out.println(integer3.equals(integer4)); // true Integer integer5 = Integer.valueOf(128);
Integer integer6 = Integer.valueOf(128);
System.out.println(integer5 == integer6); // false
System.out.println(integer5.equals(integer6)); // true
}
}
在上面的代码中,我们先使用实例化的方法,结果跟之前文章所讲的 equals 方法时所得的结果一样,当我们使用 valueOf() 方法时,发现 == 也变为了 true,这是因为 valueOf 会重用对象,并不会重新分配地址,但是仅限于 -128 -- 127 之间的整数。一旦超过会去 new 一个新对象。相比较而言,在 -128 -- 127 之间时,valueOf 会帮我们节省一部分内存空间,所以推荐使用 valueOf。
当然包装类也为我们提供了转为基本类型的方法,如下:
public class Main {
public static void main(String[] args) {
Integer integer = Integer.valueOf(128); int int1 = integer.intValue();
System.out.println(int1); // float float1 = integer.floatValue();
System.out.println(float1); // 128.0 // byte 类型为 -128 -- 127,超出会重新计算
byte byte1 = integer.byteValue();
System.out.println(byte1); // -128
}
}
那我们怎么知道各个基本类型的最大值和最小值呢?包装类其实已经很贴心的为我们提供了方法,如下:
/**
* 数字类型包装类都支持两个常量
* MAX_VALUE , MIN_VALUE
* 分别保存了对应基本类型的最大值和最小值
* */
public class Main {
public static void main(String[] args) {
int intMax = Integer.MAX_VALUE;
int intMin = Integer.MIN_VALUE;
System.out.println(intMax); //
System.out.println(intMin); // -2147483648 byte byteMax = Byte.MAX_VALUE;
byte byteMin = Byte.MIN_VALUE;
System.out.println(byteMax); //
System.out.println(byteMin); // -128
}
}
通过上面的代码我们了解了包装类的一些基本特征和使用方法,那我们使用包装类的常用方法时什么呢?如下:
/**
* 包装类提供了一个静态方法 parseXXX(String str)
* 可以将给定的字符串转换为对应的基本类型
* 前提是该字符串必须正确的描述基本类型可以保存的值
*/
public class Main {
public static void main(String[] args) {
String str = "123";
int i = Integer.parseInt(str);
System.out.println(i); // double d = Double.parseDouble(str);
System.out.println(d); // 123.0 float f = Float.parseFloat(str);
System.out.println(f); // 123.0 String str1 = "123.123";
int i1 = Integer.parseInt(str1);
System.out.println(i1); // 编译错误,Integer 并不能识别小数位 double d1 = Double.parseDouble(str1);
System.out.println(d1); // 123.123
}
}
在上面的代码中,我们分别定义了 "123" 和 "123.123" 两个字符串,从上面的输出结果可以看出,只有字符串能正确额描述基本类型可以保存的值才能运行成功。
接下来我们再来看一个包装类的自动拆装箱
/**
* JDK1.5 以后推出的新特性
* 自动拆装箱
*/
public class Main {
public static void main(String[] args) {
/**
* 自动拆装箱是编译器认可,而不是虚拟机认可
* 编译器在将源程序编译时自动补充代码来完成基本类型与包装类的转换
* */
int i = new Integer(1); // 编译器会默认在后面加 .intValue()
Integer ii = 123; // 编译器会默认变为 Integer.valueOf(123)
}
}
在上面的代码中,我们可以看到 int 类型可以直接接受一个是实例化的包装类,包装类也可以直接接受一个基本类型的值,这就是自动拆装箱,避免了我们在编写程序时的转换,减少了代码量。
Java 从入门到进阶之路(十九)的更多相关文章
- Java 从入门到进阶之路(九)
之前的文章我们介绍了一下 Java 中的构造方法,接下来我们再来看一下 Java 中的引用型数组类型. 现在我们想定义一个坐标系,然后通过横坐标(row)和纵坐标(col)来确定一个坐标点,代码如下: ...
- Java 从入门到进阶之路(十)
之前的文章我们介绍了一下 Java 中的引用型数组类型,接下来我们再来看一下 Java 中的继承. 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继 ...
- Java 从入门到进阶之路(十二)
在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...
- Java 从入门到进阶之路(十五)
在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意 ...
- Java 从入门到进阶之路(十四)
在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...
- Java 从入门到进阶之路(十六)
在之前的文章我们介绍了一下 Java 中类的多态,本章我们来看一下 Java 中类的内部类. 在 Java 中,内部类分为成员内部类和匿名内部类. 我们先来看一下成员内部类: 1.类中套类,外面的叫外 ...
- Java 从入门到进阶之路(二十)
在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ...
- Java 从入门到进阶之路(二十二)
在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 中的一些常用方法,本章我们来看一下 Java 集合框架中的Collection 的迭代器 Iterator. 当我们创建 ...
- Java 从入门到进阶之路(十八)
在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object. 在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更 ...
随机推荐
- MUI - 实现关闭除指定页面外的其他所有页面的功能
实现关闭除指定页面外的其他所有页面的功能 比如在实现注销登录功能时,要保证旧有的webweiw或缓存不影响新用户的操作,就需要在跳转到登陆页面前关闭其他页面. http://www.cnblogs.c ...
- SGU 103 Traffic Lights【最短路】
题目链接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=16530 题意: 给定每个点最初的颜色,最初颜色持续时间,以 ...
- SecureCRT 7.1.1和SecureFx key 亲测可用
CRT:Name: ygeRCompany: TEAM ZWTSerialNumber: 03-77-119256License Key: ABH2MJ 9YVAC5 Z17QF7 4ZAS7Z AB ...
- @noi.ac - 492@ casino
目录 @description@ @solution@ @solution@ @part - 1@ @part - 2@ @part - 3@ @accepted code@ @details@ @d ...
- H3C V.24接口线缆
- 队列&优先队列
1.队列 普通的队列都是先进先出,元素从队尾添加,从队头删除. function queue(){ var arr=[]; this.enqueue=function(item){ arr.push( ...
- jq制作tab栏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Array.from()类数组转化为数组的用法
类数组对象转化为数组 let arrayLike = { '0': 'a', '1': 'b', '2': 'c', length: 3 }; let arr = Array.from(arrayLi ...
- Python--day25--复习(单继承和多继承的总结)
- tf.nn.embedding_lookup()的用法
函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...