[Java 基础]数据类型
基本类型和引用类型
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表示范围的数据将会丢失,导致结果的不确定性。
反之,“小”数据向“大”数据转换,则不会存在数据丢失情况。由于这个原因,这种类型转换也称为扩大转换。
这些类型由“小”到“大”分别为:(byte,short,char)< 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 基础]数据类型的更多相关文章
- Java基础-数据类型应用案例展示
Java基础-数据类型应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.把long数据转换成字节数组,把字节数组数据转换成long. /* @author :yinz ...
- Java基础-数据类型int,short,char,long,float,double,boolean,byte
Java语言是静态类型的(statical typed),也就是说所有变量和表达式的类型再编译时就已经完全确定.由于是statical typed,导致Java语言也是强类型(Strong typed ...
- java基础数据类型包装类
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- 谈谈Java基础数据类型
Java的基本数据类型 类型 意义 取值 boolean 布尔值 true或false byte 8位有符号整型 -128~127 short 16位有符号整型 -pow(2,15)~pow(2,15 ...
- Java基础数据类型二进制转换
前言: 本文主要介绍java基础类型的二进制转换和二进制的基本概念. 二进制: 1,二进制是以0和1为码,逢2进1,比如3=11=1*2+1. 2,在计算机当中其它进制的算法基本基于2进制,因为计算机 ...
- java基础-数据类型之殇
一 前言 Java的数据类型分为2种,分别是基本数据类型和引用数据类型:java的数据类型是强数据类型,意味着每声明一个变量,其必定有与之对应的数据类型:面试常问的java8大基本数据类型其实是基本数 ...
- Java 基础数据类型
Java 提供的基础数据类型(也称内置数据类型)包含:整数类型.浮点类型.字符类型.布尔类型. 整数类型 整数类型变量用来表示整数的数据类型.整数类型又分为字节型(byte).短整型(short).整 ...
- [未完成]关于java基础数据类型中的一些总结
java基本数据类型转换图: 有时候也把char型成为字符型,是加上字符型也是一种特殊的整数类型.
- 【Demo 0001】Java基础-数据类型
本章学习要点: 1. 了解Java 语言 2. 了解Java程序结构; 3. 了解Java中基本数据类型; 4. 掌握基本数据类型之间的运算 ...
- JAVA基础数据类型
JAVA的数据类型粗略分两种 1.基本数据类型 整数类型: byte,short,int,long 浮点类型: float,double 字符类型: char 布尔类型: boolean 基本语法格式 ...
随机推荐
- linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程
1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方 ...
- c#处理空白字符
空白字符是指在屏幕不会显示出来的字符(如空格,制表符tab,回车换行等).空格.制表符.换行符.回车.换页垂直制表符和换行符称为 “空白字符”,因为它们为与间距单词和行在打印的页 )的用途可以读取更加 ...
- UWP开发之控件:用WebView做聊天框
目录 说明 WebView存在的价值 使用WebView的几个重要技巧 使用WebView做的聊天框 说明 大家都知道,无论是之前的Winform.WPF还是现在的IOS.Android开发中,都存在 ...
- 使用 SailingEase WinForm 框架构建复合式应用程序(插件式应用程序)
对于一些较小的项目,具备一定经验的开发人员应该能够设计和构建出便于进行维护和扩展的应用程序.但是,随着功能模块数量(以及开发维护这些部件的人员)的不断增加,对项目实施控制的难度开始呈指数级增长. Sa ...
- 用Powershell启用Windows Azure上的远程桌面服务
[题外话] 某天不小心点了XX管家的自动修复,虽然及时点了取消也看到了远程桌面服务成功被关闭,但是忙完该干的事以后竟然忘记了这件事,在断开远程桌面服务之前也忘记再次打开.以至于之后几天一直以为Azur ...
- 【VC++技术杂谈002】打印技术之获取及设置系统默认打印机
本文主要介绍如何获取以及设置系统的默认打印机. 1.获取系统中的所有打印机 获取系统中的所有打印机可以使用EnumPrinters()函数,该函数可以枚举全部的本地.网络打印机信息.其函数原型为: B ...
- Stored Procedure 里的 WITH RECOMPILE 到底是干麻的?
在 SQL Server 创建或修改「存储过程(stored procedure)」时,可加上 WITH RECOMPILE 选项,但多数文档或书籍都写得语焉不详,或只解释为「每次执行此存储过程时,都 ...
- css垂直居中那点事
这是我技术博客生涯的第一篇文章,想想还是有点小鸡冻...菜鸟的征程现在要开始了 学习css的时候经常被各种问题纠结到不要不要的,没办法,只能写写博客帮助整理一下自己的思绪和帮助一下和我遇到同样问题的小 ...
- 【Win 10应用开发】SplitView控件
SplitView控件用于呈现分隔视图,简单地说,就是把一个视图分割为两部分,Content属性所表示的为主要视图,而Pane属性设置的视图则可以隐藏,可以折叠和展开. 估计文字是不太容易介绍这个控件 ...
- 【原创】开源Math.NET基础数学类库使用(05)C#解析Delimited Formats数据格式
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...