Java的数据类型 和自动装箱拆箱机制

Java的数据类型 和装箱拆箱机制

数据类型

在这里插入图片描述
第一类整数型(byte short int long)
Java各整数型有固定的表示范围和字段长度 ,不会受到不同操作系统的影响,这点确保了java程序的可移植性。
Java中整数型的数据默认值为int.
表示方式
十进制:123
八进制:必须以0开头 012
十六进制:必须以0x或者0X开头 0x88
表示范围
在这里插入图片描述
注意:声明Long型变量,赋值时后面必须加L或者l
第二类浮点型(float double)
在Java中浮点型数据的默认值为double
表示形式
十进制数形式:3.14 256.0
科学计数法形式:3.14e 3.14E2 3.14E-2
表示范围
在这里插入图片描述
注意:给float型变量赋值时后面必须加l或者L
第三类布尔型(boolean)
布尔型的值只有true和false两种,分别代表的是逻辑真和逻辑假。
第四类字符型(char)
JAVA字符采用Unicode编码,一个字符占用两个字节;字符常量为单引号括起来的单个字符,例如char Char=‘a’;
也可以用十六进制来表示字符常量,例如char Char=’\u0062’;

自动拆装箱机制

1.什么是拆箱和装箱
在java中我们最常见的数据都是对象,有时候为了需要,要求基本类型的数据具有对象的性质,因此需要将基本数据类型转换为包装器型。
将基本类型装换成包装器类型的过程称为装箱,将包装器类型装换成基本类型的过程称为拆箱
基本类型与包装器类型对应关系如下:
在这里插入图片描述
2.自动拆装箱原理
自动拆装箱是在jdk1.5新增的功能特性。自动拆装箱的过程是由编译器完成的而不是由jvm完成的,在编译的过程中,是否拆箱和装箱完全是由编译器器进行判断的。
3.容易出错的地方
下面我们来看一段代码,试着想一下输出的结果。

public class TestDemo {
    public static void main(String[] args) {
        Integer i1=100;//装箱
        Integer i2=100;
        Integer i3=200;
        Integer i4=200;
        System.out.println(i1==i2);
        System.out.println(i3==i4);
    }
}

答案会不会是两个false?
运行结果:
在这里插入图片描述
为什么会出现这样的结果?
在java底层,装箱的过程都是通过valueof()这个方法来实现的。
Integer 的vauleof()源码:

 public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

通过阅读源码我们可以发现,当Integer类加载的时候,会在内部缓存创建256个Integer对象(-128~+127),当valueof(int i)这个方法转换上述范围的数据时候则不会创建新的对象而是从内部缓存直接获取,当转换不在这个范围的数据时则会new一个新的对象。

package cn.feike.shoot; import java.awt.Graphics; import java.awt.image.BufferedImage; public abstract class FlyingObject { protected double x;//物体的x坐标 protected double y;//物体的y坐标 protected double width;//物体的宽 protected double heigth;//物体的高 protected BufferedImage image;//当前正在显示的图片 protected int index = 0;//图片数组下标序号,子类中使用 protected double step;//飞行物每次(1/24秒)移动的距离 protected int life;//命 protected int state;//飞行物的状态 public static final int ACTIVE=0;//活着状态 public static final int DEAD=1;//死亡状态 public static final int REMOVE=2;//回收状态 //默认构造器 public FlyingObject() { life = 1; state = ACTIVE; } //有参构造器 public FlyingObject(double width,double heigth){ this();//调用无参数的构造器,必须写在第一行. this.x = (int)(Math.random()*(480-width)); this.y = -heigth; this.width = width; this.heigth = heigth; step = Math.random()*3+0.8;//初始化step为[0.8,3.8)之间的数 } //重写toString方法 public String toString() { return x+","+y+","+width+","+heigth+","+image; } //重写paint,方便子类对象的使用 public void paint(Graphics g) { g.drawImage(image, (int)x, (int)y, null);//绘制图片 } //飞行物移动的move方法 /** * 重构了move,方法实现播放销毁动画功能 */ public void move(){ if(state == ACTIVE){ y += step; return ; } if(state == DEAD){ //从子类对象中获取下一张照片 BufferedImage img = nextImage(); if(img == null){ state = REMOVE;//没有照片则回收 }else{ image = img;//否则把子类的图片传给image } //越界则销毁 if(y>=825){ state = REMOVE; } } } /** * 子类中必须有的方法,返回下一个要播放的照片引用, * 如果返回null表示没有可播放的照片了. */ protected abstract BufferedImage nextImage(); /** * 飞行物被打了一下 */ public void hit(){ if(life>0){ life--; } if(life==0){ state = DEAD; } } /** * 碰撞检测的方法 * 检测物体的位置是否在碰撞的范围内. * (子弹是否在飞行物的碰撞范围内) */ public boolean duang(FlyingObject obj){ //this(x,y,w,h) //obj(x,y,w,h) double x1 = this.x - obj.width; double x2 = this.x + this.width; double y1 = this.y - obj.width; double y2 = this.y + this.heigth; return x1<obj.x&&obj;.x<x2&&y1;<obj.y&&obj;.y<y2; } /** 重构FlyingObject,添加了状态检查方法 */ /** 检查飞行物死了吗 */ public boolean isDead(){ return state == DEAD; } /** 检查飞行物是否活动的 */ public boolean isActive(){ return state == ACTIVE; } /** 检查飞行是否可以被删除*/ public boolean canRemove(){ return state == REMOVE; } /** 飞行物添加"去死"方法*/ public void goDead(){ if(isActive()){ state = DEAD; } } }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值