wrapperClass 包装类
        1.包装类的特点
        2.装箱与拆箱操作
        3.数据转型处理
        
    内容
        Object 类可以接收所有的引用数据类型,因为引用数据类型本质上就是对象
        但是这之中会出现一个新的问题基本数据类型不是对象
        所以发现在最初设计的过程之中,Object 类无法接收基本数据类型

基本数据类型和引用类型之间最大的差别在于:基本数据类型属于值传递,而引用类型属于内存空间传递,这是两个不同的概念
可是考虑到一切皆对象这样的设计概念,所以最好的做法是将基本数据类型做一个包装

        所以最早人们提出一点能不能将基本数据类型包装一下就采用如下的代码结构
        范例:最初的包装设计

class Int{// 定义一个只包装int类型的包装类
private int num;//真正的基本数据类型的数据
public Int(int num){//接收基本数据类型
this,num = num;// 基本类型变为了包装类
}
public int intValue(){// 从包装类中取出基本数据类型
return this.num;
}
}
public class wrapperClass{
public static void main(String args[]){
Int x = new Int(10);// 将基本类型变为包装类
Object obj = x;// 对象转型
System.out.println(x.intValue()*x.intValue());// 取出内容才能够计算
}
}

现在发现如果所有的代码都是这样设计会存在以下问题:
                java有八种基本数据类型:需要自己编写这八个基本类型;
                基本数据类型包装类不能够直接参与数学计算
            正式因为有这样需求的提出(参数统一需求),所以从最早的JDK1.0开始就提供有了包装类,用户不需要进行包装类的设计了,
            而在JDK1.5之后有解决了包装类参与数学计算的问题
            java基本数据类型的包装类:byte(Byte),short(Short),int(Integer),long(Long),float(Float).double(Double),char(Character),boolean(Boolean)
            而这八种包装类也分为两种类型
                对象型(java.lang.Object 直接子类): Character,Boolean;
                数值型(java.lang.Number 直接子类): Byte,Short,Integer.Long Float,Double
            对于Number类可以发现其本质上是一个抽象类:
                public abstract class Number extends Object implements Serializable
            而后在这个Number类中提供有六个操作方法:
                从包装类取出 byte 数据: public byte byteValue();
                从包装类取出 int 数据: public abstract int intValue();
                从包装类取出 short 数据: public short shortValue();
                从包装类取出 long 数据: public abstract long longValue();
                从包装类取出 float 数据: public abstract float floatValue();
                从包装类取出 double 数据: public abstract double doubleValue();
            那么严格来讲这几个方法都属于拆箱方法

    装箱与拆箱操作
        对于基本数据类型与包装类之间的转换分为以下两个概念:
            装箱操作:将基本数据类型变为包装类,各个包装类的构造完成;
                Integer类的构造: public Integer(int value);
                Double类的构造: public Double(double value);
                Boolean类的构造: public Boolean(boolean value);
            拆箱操作:将包装类中的基本数据类型取出,如果是Object类型的包装类则每一个包装类中会有拆箱操作方法,
            而如果是Number 的包装类,所有的拆箱方法都在 Number类中定义完成了
                Number 父类里面就定义有拆箱操作的方法:???Value()方法
            
        范例:以 Integer与 int为例

            public class wrapperClass{
public static void main(String args[]){
Integer x = new Integer(10);//装箱操作
int temp = x.intValue(); // 拆箱操作
}
}

范例:以 Double 与 double 为例

public class wrapperClass{
public static void main(String args[]){
Double x = new Double(10.0);//装箱操作
double temp = x.doubleValue(); // 拆箱操作
}
}

范例:以 Boolean 与 boolean 为例

           public class wrapperClass{
public static void main(String args[]){
Boolean x = new Boolean(true);//装箱操作
boolean temp = x.booleanValue(); // 拆箱操作
}
}

所有的装箱与拆箱操作都是固定的操作模式,然而以上的代码是在JDK1.5之前采用的,现在不可能采用此方式了
        因为太麻烦了,所以从JDK1.5之后提供有自动装箱与拆箱的支持
        范例:以 Integer与 int为例

            public class wrapperClass{
public static void main(String args[]){
Integer x = 100;//自动装箱为类操作
int y = x;
System.out.println(++ x * y);// 直接自动拆箱进行累加操作
}
}// 结果:10100           

范例:以 Double 与 double 为例

            public class wrapperClass{
public static void main(String args[]){
Double x = 100.1;
double y = x;
System.out.println(++ x * y);
}
}

范例:以 Boolean 与 boolean 为例

            public class wrapperClass{
public static void main(String args[]){
Boolean flag = true;
if(flag){ // 对象判断,自动拆箱
System.out.println("***********************");
}
}
}

实际上有了这种自动装箱的机制存在,就可以使用Object 接收基本数据类型了
        范例:利用 Object 接收 int

            public class wrapperClass{
public static void main(String args[]){
Object obj = 10; // 转换:10 自动装箱为 Integer,Integer 向上转型
int temp = (Integer)obj;// 向上转型为 Integer ,自动拆箱为int
System.out.println(++ x * y);// 直接自动拆箱进行累加操作
}
}

结论:Object 无所不能,所有数据类型都可以接收,万能的很

    数据类型转换
        包装类本身有一个非常重要的功能,就是字符串转换为基本数据类型的操作
        在实际所有的开发之中,用户只要执行数据的输入操作,其类型就是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()方法,直接选0索引即可
        范例:以 Integer 为例

            public class wrapperClass{
public static void main(String args[]){
String str = "100";// 字符串数字组成
int num = Integer.parseInt(str);// 将字符串转换为int
System.out.println(num * 2);
}
}

但是此时有两点注意
                1.如果字符串要转换为数字,其必须由数字所组成
        范例:错误代码

            public class wrapperClass{
public static void main(String args[]){
String str = "acb22";// 字符串数字组成
int num = Integer.parseInt(str);// 将字符串转换为int
System.out.println(num * 2);
}
}           

2.关于比较的问题

            public class wrapperClass{
public static void main(String args[]){
String str = "100";// 字符串数字组成
int num = Integer.parseInt(str);// 将字符串转换为int
Integer x1 = 100;
Integer x1 = new Integer(100);
System.out.println(x1 == num);
System.out.println(x1 == x2);(使用 extends 才是.....)
}
}/* 结果:
true
false     */

因为在实际的开发之中,包装类使用比较多,所以在进行“==”比较的时候,要使用 extends() 方法才是最保险的
        
        范例:以 Double 为例

            public class wrapperClass{
public static void main(String args[]){
String str = "100.1";// 字符串数字组成
double num = Double.parseInt(str);// 将字符串转换为int
System.out.println(num * 2);
}
}

在使用 parseDouble() 将字符串转换为 double 类型的时候,里面的组成可以是整数也可以是小数
                
        范例:以 Boolean为例

            public class wrapperClass{
public static void main(String args[]){
String str = "100";
            // 字符串数字组成 如果是true 打印的是 * ,是 false 打印 #
boolean flag = Boolean.parseBoolean(str); // false
if(flag){
System.out.println("***********************");
}else{
System.out.println("#####################");
}
}
}// 结果: #####################

发现在使用 Boolean 类型操作的时候比较方便,即使给定的字符串内容不是 true 或者 false,其最终都会统一按照 false 来进行处理
        提示:String与基本数据类型的转换
            String 要变为基本数据类型:包装类中的 parse???()方法
            基本数据类型变为String呢?
                任何的数据类型使用“+”与String连接都会转换为String类型

            public class wrapperClass{
public static void main(String args[]){
String str = "hello";// 字符串数字组成
System.out.println(str + 100); // hello 100
}
}

本代码实际上进行一个字符串的连接操作,连接之后一定会产生垃圾
            在String类中有一组重载的valueOf() 方法:

                public class wrapperClass{
public static void main(String args[]){
String str = String.valueOf(100);// 字符串数字组成
System.out.println(str.length()); //
}
}

这样编写的好处是可以避免垃圾的产生
                
    总结
        1.自动装箱与拆箱的特点
        2.NNumber类的定义以及方法
        3.基本数据类型与String的转换

菜鸡的Java笔记 第二十五 wrapperClass 包装类的更多相关文章

  1. 菜鸡的Java笔记 第二十八 - java 包的定义

    包的主要作用以及定义    包的导入操作    系统常见的开发包    jar 程序命令        包的定义        在任何的操作系统之中都有一个统一的共识:同一个目录下不能够存在有相同的文 ...

  2. 菜鸡的Java笔记 第二十九 - java 单例设计模式

    SingleCase 单例设计模式        1.单例设计模式的特点        2.多例设计模式的特点    内容    单例设计模式        现在如果说有这么一个程序类 class S ...

  3. 菜鸡的Java笔记 第二十六 - java 内部类

    /*    innerClass        从实际的开发来看,真正写到内部类的时候是在很久以后了,短期内如果是自己编写代码,几乎是见不到内部类出现的        讲解它的目的第一个是为了解释概念 ...

  4. 菜鸡的Java笔记 第二十四 - java 接口的基本定义

    1.接口的基本定义以及使用形式        2.与接口有关的设计模式的初步认识        3.接口与抽象类的区别                 接口与抽象类相比,接口的使用几率是最高的,所有的 ...

  5. 菜鸡的Java笔记 第二十二 - java 对象多态性

    本次只是围绕着多态性的概念来进行讲解,但是所讲解的代码与实际的开发几乎没有关系,而且多态一定是在继承性的基础上才可以操作的,        而本次将使用类继承的关系来描述多态的性质,实际的开发中不会出 ...

  6. 菜鸡的Java笔记 第十五 this 关键字

    this 关键字                对于this关键字有三种用法:表示本类属性,调用本类方法,当前对象        this 关键字如何实现属性,方法的调用,以及对象本身的描述      ...

  7. 菜鸡的Java笔记 第二十 - java 方法的覆写

    1.方法的覆写    当子类定义了与父类中的完全一样的方法时(方法名称,参数类型以及个数,返回值类型)这样的操作就称为方法的覆写    范例:观察方法的覆写 class A{ public void ...

  8. 菜鸡的Java笔记 第十九 - java 继承

    继承性的主要目的,继承的实现,继承的限制                继承是面向对象中的第二大主要特点,其核心的本质在于:可以将父类的功能一直沿用下去                为什么需要继承? ...

  9. 菜鸡的Java笔记 第十六 - java 引用传递

    referenceDelivery    引用传递是整个java 的精髓,也是所有初学者最难学的地方        引用的本质:同一块堆内存可以被不同的栈内存所指向    下面通过三道程序来进行引用传 ...

随机推荐

  1. Matrix Analysis and Application

    Chap 1: Linear Equations and Matrix Linear equations Gaussian elimination Pivot; Triangularize; Back ...

  2. 踩坑系列《二》NewProxyResultSet.isClosed()Z is abstract 报错踩坑

    在运行测试类的时候莫名其妙的报了个 NewProxyResultSet.isClosed()Z is abstract 这个错误,之前出现过这个错误,以为是版本出现了问题 就将版本 0.9.1.2 改 ...

  3. VulnHub 实战靶场Breach-1.0

    相比于CTF题目,Vulnhub的靶场更贴近于实际一些,而且更加综合考察了知识.在这里记录以下打这个靶场的过程和心得. 测试环境 Kali linux IP:192.168.110.128 Breac ...

  4. C++核心编程 4 类和对象-对象的初始化和清理

    构造函数和析构函数 对象的初始化和清理工作是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用结果是未知的,同样,使用完一个对象或变量,没有及时清理,也会造成一定的安全问题.C++利用了构 ...

  5. Python读取网页表格数据

    学会了从网格爬取数据,就可以告别从网站一页一页复制表格数据的时代了. 说个亲身经历的事: 以前我的本科毕业论文是关于"燃放烟花爆竹和空气质量"之间关系的,就要从环保局官网查资料. ...

  6. 题解 「BZOJ4919 Lydsy1706月赛」大根堆

    题目传送门 题目大意 给出一个 \(n\) 个点的树,每个点有权值,从中选出一些点,使得满足大根堆的性质.(即一个点的祖先节点如果选了那么该点的祖先节点的权值一定需要大于该点权值) 问能选出来的大根堆 ...

  7. 并发编程从零开始(八)-ConcurrentHashMap

    并发编程从零开始(八)-ConcurrentHashMap 5.5 ConcurrentHashMap HashMap通常的实现方式是"数组+链表",这种方式被称为"拉链 ...

  8. Harbour.Space Scholarship Contest 2021-2022 (Div. 1 + Div. 2) Editorial题解

    A 略,发现只有当末尾为9时才满足条件.. B 简单模拟,注意数组大小!!! C 简单模拟. D 比较暴力的一个做法就是每次找一个开始匹配的起始点,然后每次不同时向后跳2就行了. 注意这里最后还要判断 ...

  9. hdu 2147 kiki's game(DP(SG)打表找规律)

    题意: n*m的棋盘,一枚硬币右上角,每人每次可将硬币移向三个方向之一(一格单位):左边,下边,左下边. 无法移动硬币的人负. 给出n和m,问,先手胜还是后手胜. 数据范围: n, m (0<n ...

  10. Python3使用Print输出彩色字体

    一.介绍 在一些开发程序中,有些输出消息需要突出显示,我们可以尝试着给他们换上更靓丽的颜色来突出显示. 二.实现过程 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. ...