代码演示(手动):
package com.bjpowernode.javase.integer;
/*
1. java中为8种基本数据类型又对应了8种包装类型,8种包装类型属于引用数据类型,父类是Object
*/
public class IntegerTest01 {
// 程序入口
public static void main(String[] args) {
// 有没有这种需求:调用doSome()方法的时候需要传一个数字进去
// 但是数字属于基本数据类型,而doSome()方法参数的类型是Object引用数据类型
// 可见doSome()方法无法接收基本数据类型的数字 那怎么办呢?可以传一个数字对应的包装类进去
// 把100这个数字经过构造方法包装成对象
MyInt myInt =new MyInt(100); // MyInt 为包装类
doSome(myInt); // 将 new MyInt(100); 传入doSome方法
}
// doSome方法
public static void doSome(Object obj){ // Object obj =new MyInt(100); // 多态
// System.out.println(obj); // com.bjpowernode.javase.integer.MyInt@1b6d3586
// 输出结果表明:MyInt类没有重写父类Object的toString方法
System.out.println(obj); // 100 输出引用自动调用toString方法
}
}
我们手动包装的类:(SUN公司其实帮我们写好了包装类 我们只需要调用即可)
package com.bjpowernode.javase.integer;
// 这种包装类目前是咱们自己写的,实际开发种我们不需要自己写
public class MyInt {
int value;
public MyInt() {
}
public MyInt(int value) {
this.value = value;
}
@Override
public String toString() {
return String.valueOf(value); // 将非字符串转换成字符串
}
}
一、八种包装类都是什么?
8种基本数据类型对应的包装类型名是什么?
基本数据类型 包装类型
-------------------------------------
byte java.lang.Byte(父类Number)
short java.lang.Short(父类Number)
int java.lang.Integer(父类Number)
long java.lang.Long(父类Number)
float java.lang.Float(父类Number)
double java.lang.Double(父类Number)
boolean java.lang.Boolean(父类Object)
char java.lang.Character(父类Object)以上八种包装类中,重点以java.lang.Integer为代表学习,其他的类型照葫芦画瓢即可
代码演示:
public class IntegerTest02 {
public static void main(String[] args) {
// 100 这个基本数据类型,进行构造方法的包装达到了:基本数据类型向引用数据类型的转换
Integer i=new Integer(100);
doSome(i); // i 引用数据类型
}
public static void doSome(Object obj){
System.out.println(obj); // 100
}
}
二、装箱和拆箱
3、八种包装类其中6个都是数字对应的包装类,他们的父类都是Number,可以先研究以下Number中公共的方法:
Number是一个抽象类,无法实例化对象
Number类中有这样的方法:
// 以int形式返回指定的数值
1、 public abstract int intValue()
2、 public abstract long longValue()
3、public abstract float floatValue()
4、 public abstract double doubleValue()
5、 public byte byteValue()
6、 public short shortValue()
以上这些方法是负责拆箱的
代码演示如下:
public class IntegerTest02 {
public static void main(String[] args) {
// 100这个基本数据类型,进行构造方法的包装达到了:基本数据类型向引用数据类型的转换
// 将基本数据类型(100)----(转换)----->引用数据类型(i) 【装箱】
Integer i=new Integer(100);
// 因为Integer默认继承父类Number、Number类是一个抽象类 里面也有很多(拆箱)的方法 如:public abstract int intValue()
// 将引用数据类型----(转换)-----> 基本数据类型
float a =i.floatValue(); // 非抽象类子类必须重写父类的抽象方法(能调用输出结果 说明子类Integer重写了父类的floatValue方法)
System.out.println(a); // 100.0
// 将引用数据类型----(转换)----->基本数据类型 【拆箱】
int a1 =i.intValue();
System.out.println(a1); // 100
}
}
三、自动装箱、拆箱[记住这个即可]
package com.bjpowernode.javase.integer;
public class IntegerTest03 {
public static void main(String[] args) {
// 900是基本数据类型
// a是包装类型
// 基本数据类型----(自动转换)-----> 包装类型 【自动装箱】
Integer a =900;
System.out.println(a); // 900
// a是包装类型
// b是基本数据类型
// 包装类型----(自动转换)-----> 基本数据类型 【自动拆箱】
int b=a.intValue();
System.out.println(b); // 900
// 分析以下代码为什么没报错呢?
// +两边要求是基本数据类型的数字,z是包装类,不属于基本数据类型,这里会进行自动拆箱。将z转换成基本数据类型
// z是一个引用,z还是保存了一个对象的内存地址 还相当于 Integer z =new Integer(1000);
Integer z =1000;
System.out.println(z+1); // 1001 说明z进行了自动拆箱(自动拆箱机制)
Integer x =5000; //x是一个引用,x还是保存了一个对象的内存地址 还相当于 Integer x =new Integer(1000);
Integer y =5000;
// "=="比较的是对象的内存地址
// 这里不会触发自动拆箱机制(把x、y拆箱成5000 不会的) 只有+ - * / 等才会触发自动拆箱机制
System.out.println(x==y); // false
}
}
思考以下代码:
package com.bjpowernode.javase.integer;
public class IntegerTest04 {
public static void main(String[] args) {
Integer a =128; // 因为这里相当于 Integer a =new Integer(128); 还是需要new对象
Integer b =128;
System.out.println(a==b); // false 两个对象内存地址不同 所以false
// 分析下列的c==d为什么就true了呢?
/*
java中为了提高程序的执行效率,将[-128~127]之间所有的包装对象提前创建好,
放到了一个方法区的"整数常量池"当中了,目的是只要用这个区间的数据不需要再
new Integer对象了,直接从整数型常量池当中取出来
*/
Integer c =127;
Integer d =127;
System.out.println(c==d); // true
}
}
内存图演示:
四、Integer类当中的常用方法
package com.bjpowernode.javase.integer;
public class IntegerTest05 {
public static void main(String[] args) {
// 手动装箱
// 基本数据类型>>>包装类型
Integer a =new Integer(1000);
// 手动拆箱
// 包装类型>>>基本数据类型
int b =a.intValue();
System.out.println(b); // 1000
Integer c =new Integer("90");
System.out.println(c); // 90
// Integer d =new Integer("中文");
// System.out.println(d); // 报错:NumberFormatException异常
// 得出结论:基本数据类型可以传整数型、字符串型(但字符串型必须是数字).....
}
}
重点方法:!!!!!【以后做项目用的到】
package com.bjpowernode.javase.integer;
import javafx.beans.binding.DoubleExpression;
public class IntegerTest05 {
public static void main(String[] args) {
// Integer当中的重点方法: public static int parseInt(String s)
// 静态方法 返回值为int 传参String类型
//用处: 以后做项目,在网页上文本框中输入100实际上是”100“字符串,后台数据库中要求储存100数字,
// 此时java程序需要将”100“转换成100,需要用到此方法 【网页上输入个100 其实输入的100是字符串类型】
int s =Integer.parseInt("986");
System.out.println(s); // 986
// 记住不能输中文字符串
// int a =Integer.parseInt("中文"); // 异常:NumberFormatException
// 比葫芦画瓢
double s1 = Double.parseDouble("3.14");
System.out.println(s1); // 3.14
}
}