基本类型和引用类型

Java中的数据类型有两类:

l  基本类型(又叫内置数据类型,或理解为值类型)

l  引用类型

基本类型和引用类型的区别

1.  从概念方面来说

基本类型:变量名指向具体的数值

引用类型:变量名指向存数据对象的内存地址

2.  从内存构建方面来说

基本类型:变量在声明之后java就会立刻分配给他内存空间

引用类型:它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址。

3.  从使用方面来说

基本类型:使用时需要赋具体值,判断时使用“==”号

引用类型:使用时可以赋null,判断时使用equals方法

Java 基本类型

​Java的每种基本类型所占存储空间的大小是固定的。它们的大小不像其他大多数语言那样随机器硬件架构的变化而变化。这种不变性是Java程序相对其他大多数语言而言,更容易移植的原因之一。

所有数值类型都有正负号,所以不要去寻找无符号的数值类型。

基本类型的分类

与绝大多数编程语言类似,Java也支持数值型、字符型、布尔型数据。

Java语言提供了8种基本类型,大致分为4

整数型

byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。

short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。

int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。

long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。

浮点型

float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。

double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。

字符型

char:16位,存储Unicode码,用单引号赋值。

布尔型

boolean:只有true和false两个取值。

基本类型取值范围表

例:对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。

publicclass PrimitiveDemo  {

publicstaticvoid main(String[] args) {

// byte

System.out.printf("基本类型:byte 二进制位数:%d\n", Byte.SIZE);

System.out.printf("包装类:%s\n", Byte.class.getName());

System.out.printf("最小值(Byte.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", Byte.MIN_VALUE,  Byte.MIN_VALUE);

System.out.printf("最大值(Byte.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", Byte.MAX_VALUE,  Byte.MAX_VALUE);

// short

System.out.printf("基本类型:short 二进制位数:%d\n", Short.SIZE);

System.out.printf("包装类:%s\n", Short.class.getName());

System.out.printf("最小值(Short.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", Short.MIN_VALUE,  Short.MIN_VALUE);

System.out.printf("最大值(Short.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", Short.MAX_VALUE,  Short.MAX_VALUE);

// int

System.out.printf("基本类型:int 二进制位数:%d\n", Integer.SIZE);

System.out.printf("包装类:%s\n", Integer.class.getName());

System.out.printf("最小值(Integer.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", Integer.MIN_VALUE,  Integer.MIN_VALUE);

System.out.printf("最大值(Integer.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", Integer.MAX_VALUE,  Integer.MAX_VALUE);

// long

System.out.printf("基本类型:long 二进制位数:%d\n", Long.SIZE);

System.out.printf("包装类:%s\n", Long.class.getName());

System.out.printf("最小值(Long.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", Long.MIN_VALUE,  Long.MIN_VALUE);

System.out.printf("最大值(Long.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", Long.MAX_VALUE,  Long.MAX_VALUE);

// float

System.out.printf("基本类型:float 二进制位数:%d\n", Float.SIZE);

System.out.printf("包装类:%s\n", Float.class.getName());

System.out.printf("最小值(Float.MIN_VALUE): %s\n", Float.toString(Float.MIN_VALUE));

System.out.printf("最大值(Float.MAX_VALUE): %s\n\n", Float.toString(Float.MAX_VALUE));

// double

System.out.printf("基本类型:double 二进制位数:%d\n", Double.SIZE);

System.out.printf("包装类:%s\n", Double.class.getName());

System.out.printf("最小值(Double.MIN_VALUE): %s\n", Double.toString(Double.MIN_VALUE));

System.out.printf("最大值(Double.MAX_VALUE): %s\n\n", Double.toString(Double.MAX_VALUE));

// char

System.out.printf("基本类型:char 二进制位数:%d\n", Character.SIZE);

System.out.printf("包装类:%s\n", Character.class.getName());

System.out.printf("最小值(Character.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", (int)  Character.MIN_VALUE, (int) Character.MIN_VALUE);

System.out.printf("最大值(Character.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", (int)  Character.MAX_VALUE, (int) Character.MAX_VALUE);

}

}

输出:

基本类型:byte 二进制位数:8

包装类:java.lang.Byte

最小值(Byte.MIN_VALUE):  0x80(十六进制), -128(十进制)

最大值(Byte.MAX_VALUE):  0x7f(十六进制), 127(十进制)

基本类型:short 二进制位数:16

包装类:java.lang.Short

最小值(Short.MIN_VALUE):  0x8000(十六进制), -32768(十进制)

最大值(Short.MAX_VALUE):  0x7fff(十六进制), 32767(十进制)

基本类型:int 二进制位数:32

包装类:java.lang.Integer

最小值(Integer.MIN_VALUE):  0x80000000(十六进制), -2147483648(十进制)

最大值(Integer.MAX_VALUE):  0x7fffffff(十六进制), 2147483647(十进制)

基本类型:long 二进制位数:64

包装类:java.lang.Long

最小值(Long.MIN_VALUE):  0x8000000000000000(十六进制),  -9223372036854775808(十进制)

最大值(Long.MAX_VALUE):  0x7fffffffffffffff(十六进制),  9223372036854775807(十进制)

基本类型:float 二进制位数:32

包装类:java.lang.Float

最小值(Float.MIN_VALUE):  1.4E-45

最大值(Float.MAX_VALUE):  3.4028235E38

基本类型:double 二进制位数:64

包装类:java.lang.Double

最小值(Double.MIN_VALUE):  4.9E-324

最大值(Double.MAX_VALUE):  1.7976931348623157E308

基本类型:char 二进制位数:16

包装类:java.lang.Character

最小值(Character.MIN_VALUE):  0x0(十六进制), 0(十进制)

最大值(Character.MAX_VALUE):  0xffff(十六进制), 65535(十进制)

数据类型间的转换

自动转换

一般情况下,定义了某数据类型的变量,就不能再随意转换。但是JAVA允许用户对基本类型做有限度的类型转换。

如果符合以下条件,则JAVA将会自动做类型转换:

1)由数据转换为数据

显而易见的是,“小”数据类型的数值表示范围小于“大”数据类型的数值表示范围,即精度小于“大”数据类型。

所以,如果“大”数据向“小”数据转换,会丢失数据精度。比如:long转为int,则超出int表示范围的数据将会丢失,导致结果的不确定性。

反之,“小”数据向“大”数据转换,则不会存在数据丢失情况。由于这个原因,这种类型转换也称为扩大转换

这些类型由“小”到“大”分别为:(byteshortchar)< int long float double

这里我们所说的“大”与“小”,并不是指占用字节的多少,而是指表示值的范围的大小。

2)转换前后的数据类型要兼容

由于 boolean 类型只能存放 true 或 false,这与整数或字符是不兼容的,因此不可以做类型转换。

3)整型类型和浮点型进行计算后,结果会转为浮点类型

long x = 30;
float y = 14.3f;
System.out.println("x/y = " + x/y);

运行结果

x/y = 1.9607843

可见 long 虽然精度大于 float 类型,但是结果为浮点数类型。

强制转换

在不符合自动转换条件时或者根据用户的需要,可以对数据类型做强制的转换。

转换方式为:在数值的前面用一个括号"()"把要强制转换的类型标注出来。

float f = 25.5f;
int x = (int)f;
System.out.println("x = " + x);

装箱和拆箱

Java中基本类型的包装类如下:

Byte <-> byte

Short <-> short

Integer <-> int

Long <-> long

Float <-> float

Double <-> double

Character <-> char

Boolean <-> boolean

装箱

装箱是将值类型转换为引用类型

例:

Integer i1 = new Integer(10); // 非自动装箱

Integer i2 = 10; // 自动装箱

System.out.println("i1 = " + i1);

System.out.println("i2 = " + i2);

拆箱

拆箱是将引用类型转换为值类型

int i1 = new Integer(10); // 自动拆箱

Integer tmp = new Integer(20);

int i2 = tmp.intValue(); // 非自动拆箱

System.out.println("i1 = " + i1);

System.out.println("i2 = " + i2);

为何需要装箱

一种最普通的场景是,调用一个含类型为Object的参数的方法,该Object可支持任意类型(因为Object是所有类的父类),以便通用。当你需要将一个值类型(如Int32)传入时,需要装箱。

另一种用法是,一个非泛型的容器,同样是为了保证通用,而将元素类型定义为Object。于是,要将值类型数据加入容器时,需要装箱。

自动装箱、自动拆箱

基本数据(Primitive)类型的自动装箱(boxing)、拆箱(unboxing)是自Java SE5开始提供的功能。

Java SE5之前的形式:

Integer i1 = new Integer(10); // 非自动装箱

Java SE5之后:

Integer i2 = 10; // 自动装箱

Java对于自动装箱和拆箱的设计,依赖于一种叫做享元模式的设计模式(有兴趣的朋友可以去了解一下源码,这里不对设计模式展开详述)。

[Java 基础]数据类型的更多相关文章

  1. Java基础-数据类型应用案例展示

    Java基础-数据类型应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.把long数据转换成字节数组,把字节数组数据转换成long. /* @author :yinz ...

  2. Java基础-数据类型int,short,char,long,float,double,boolean,byte

    Java语言是静态类型的(statical typed),也就是说所有变量和表达式的类型再编译时就已经完全确定.由于是statical typed,导致Java语言也是强类型(Strong typed ...

  3. java基础数据类型包装类

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  4. 谈谈Java基础数据类型

    Java的基本数据类型 类型 意义 取值 boolean 布尔值 true或false byte 8位有符号整型 -128~127 short 16位有符号整型 -pow(2,15)~pow(2,15 ...

  5. Java基础数据类型二进制转换

    前言: 本文主要介绍java基础类型的二进制转换和二进制的基本概念. 二进制: 1,二进制是以0和1为码,逢2进1,比如3=11=1*2+1. 2,在计算机当中其它进制的算法基本基于2进制,因为计算机 ...

  6. java基础-数据类型之殇

    一 前言 Java的数据类型分为2种,分别是基本数据类型和引用数据类型:java的数据类型是强数据类型,意味着每声明一个变量,其必定有与之对应的数据类型:面试常问的java8大基本数据类型其实是基本数 ...

  7. Java 基础数据类型

    Java 提供的基础数据类型(也称内置数据类型)包含:整数类型.浮点类型.字符类型.布尔类型. 整数类型 整数类型变量用来表示整数的数据类型.整数类型又分为字节型(byte).短整型(short).整 ...

  8. [未完成]关于java基础数据类型中的一些总结

    java基本数据类型转换图: 有时候也把char型成为字符型,是加上字符型也是一种特殊的整数类型.

  9. 【Demo 0001】Java基础-数据类型

    本章学习要点:       1.  了解Java 语言       2.  了解Java程序结构;        3.  了解Java中基本数据类型;       4.  掌握基本数据类型之间的运算 ...

  10. JAVA基础数据类型

    JAVA的数据类型粗略分两种 1.基本数据类型 整数类型: byte,short,int,long 浮点类型: float,double 字符类型: char 布尔类型: boolean 基本语法格式 ...

随机推荐

  1. 借助cookie实现子网页修改父网页内容遇到的问题:同一个浏览器访问相同页面,会互相影响。 (已解决)

    问题是这样的,  我把左侧菜单做成了网页, 然后点击左侧菜单选项会改变右侧内容, 也就是子网页访问并修改父网页的内容. 为了兼容性更好, 我没有使用farther,或者opener等方法,  而是用了 ...

  2. C#与Java对比学习:数据类型、集合类、栈与队列、迭达、可变参数、枚举

    数据类型: C#:String与StringBuilder Java:String与StringBuffer 第一个不习惯是string的第一个字母必须大写了. 第二个不习惯是int得写成Intege ...

  3. MSDN杂志上Wix相关的文章

    使用 MSBuild 和 Windows Installer XML 执行自动发布: http://msdn.microsoft.com/zh-cn/magazine/cc163456.aspx 用于 ...

  4. Lesson 13 The Greenwood Boys

    Text The Greenwood Boys are group of pop singers. At present, they are visiting all parts of the cou ...

  5. Net作业调度(二) -CrystalQuartz远程管理

    Source Code-1.6M 介绍 上篇已经了解Quartz.NET的基本使用方法了.但如果想方便的知道某个作业执行情况,需要暂停,启动等操作行为,这时候就需要个Job管理的界面. 本文介绍Qua ...

  6. ASP.NET MVC SSO单点登录设计与实现

    实验环境配置 HOST文件配置如下: 127.0.0.1 app.com127.0.0.1 sso.com IIS配置如下: 应用程序池采用.Net Framework 4.0 注意IIS绑定的域名, ...

  7. HTML、CSS、JS对unicode字符的不同处理

    unicode字符的不同表示法 unicode字符在html.css和js中的表示方法均不相同,下面分别作介绍. 原文发表于这里 css表示法 首先来一段很常见的bootstrap的字体图标代码: . ...

  8. GUID简介

    GUID (全局唯一标识符) 编辑 全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点. ...

  9. 路由转发过程的IP及MAC地址变化

    A-----(B1-B2)-----(C1-C2)-------E就假设拓扑图是这个样子吧,B1和B2是路由器B上的两个接口,C1和C2是路由器C上的两个接口,A和E是PC,由主机A向主机E发送数据包 ...

  10. js创建与追加元素

    用javascript创建元素 : var NewNode = document.creatElement('div'); 结合appendChild与insertBefore插入到DOM树中 ins ...