4、Java 基本数据类型
4.1、基本数据类型
Java的两大数据类型:基本数据类型、引用类型
基本数据类型:
Java语言提供了八种基本数据类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
byte:(一个字节)
- byte 数据类型是8位(bit)、有符号的,以二进制补码表示的整数;
- 最小值是 128(2^7);
- 最大值是 127(2^71);
- 默认值是 0;
- 例子:byte a = 100,byte b = 50。
short:(两个字节)
- short 数据类型是 16 位、有符号的以二进制补码表示的整数
- 最小值是 32768(2^15);
- 最大值是 32767(2^15 1);
- Short 数据类型可以节省空间。一个short变量是int型变量所占空间的二分之一;
- 默认值是 0;
- 例子:short s = 100,short r = 200。
int:(四个字节)
- int 数据类型是32位、有符号的以二进制补码表示的整数;
- 最小值是 2,147,483,648(2^31);
- 最大值是 2,147,483,647(2^31 1);
- 一般地整型变量默认为 int 类型;
- 默认值是 0 ;
- 例子:int a = 1000, int b = 2000。
long:(8个字节)
- long 数据类型是 64 位、有符号的以二进制补码表示的整数;
- 最小值是 9,223,372,036,854,775,808(2^63);
- 最大值是 9,223,372,036,854,775,807(2^63 1);
- 这种类型主要使用在需要比较大整数的系统上;
- 默认值是 0L;
- 例子: long a = 100000L,Long b = 200000L。
注意:"L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所
以最好大写。
float:(4个字节)
- float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
- float 在储存大型浮点数组的时候可节省内存空间;
- 默认值是 0.0f;
- 浮点数不能用来表示精确的值,如货币;
- 例子:float f1 = 234.5f
double:(8个字节)
- double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数;
- 浮点数的默认类型为double类型;
- double类型同样不能表示精确的值,如货币;
- 默认值是 0.0d;
- 例子:double d1 = 123.4。
boolean:
- boolean数据类型表示一位的信息;
- 只有两个取值:true 和 false;
- 这种类型只作为一种标志来记录 true/false 情况;
- 默认值是 false;
- 例子:boolean one = true。
char:(2个字节)
- char类型是一个单一的 16 位 Unicode 字符;
- 最小值是 \u0000(即为0);
- 最大值是 \uffff(即为65,535);
- char 数据类型可以储存任何字符;
- 例子:char letter = 'A';。
类型默认值
下表列出了 Java 各个类型的默认值:
数据类型 | 默认值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | 'u0000' |
boolean | false |
String(or any object) | null |
实例
public class Test {
static boolean bool;
static byte by;
static char ch;
static double d;
static float f;
static int i;
static long l;
static short sh;
static String str;
public static void main(String[] args) {
System.out.println("Bool :" + bool);
System.out.println("Byte :" + by);
System.out.println("Character:" + ch);
System.out.println("Double :" + d);
System.out.println("Float :" + f);
System.out.println("Integer :" + i);
System.out.println("Long :" + l);
System.out.println("Short :" + sh);
System.out.println("String :" + str);
}
}
实例输出结果为:
Bool :false
Byte :0
Character:
Double :0.0
Float :0.0
Integer :0
Long :0
Short :0
String :null
Java语言支持一些特殊的转义字符序列:
符合 | 字符含义 |
\n | 换行(0x0a) |
\r | 回车(0x0d) |
\f | 换页符(0x0c) |
\b | 退格(0x08) |
\0 | 空字符(0x20) |
\s | 字符串 |
\t | 制表符 |
\' | 单引号 |
\" | 双引号 |
\\ | 反斜杆 |
\ddd | 八进制字符(ddd) |
\uxxxx | 十六进制Unicode字符(xxxx) |
引用类型:
- 在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
- 对象、数组都是引用数据类型。
- 所有引用类型的默认值都是null。
- 一个引用变量可以用来引用任何与之兼容的类型。
- 例子:Site site = new Site("Runoob")。
4.2、基本数据类型的包装类
Java每个基本类型在java.lang包中都有一个相应的包装类
包装类有何作用
1. 提供了一系列实用的方法
2. 集合不允许存放基本数据类型数据,存放数字时,要用包装类型
基本数据类型 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Characher |
boolean | Boolean |
这八种包装类所继承的父类不全都相同。
1)Integer ,Byte,Float,Double,Short,Long都属于Number类的子类,Number类本身提供了一系列的返回以上六种基本数据类型的操作。
2)Character属于Object子类。
3)Boolean属于Object子类。
装箱及拆箱
1)将基本数据类型变成包装类称为装箱。
2)将包装类的类型变为基本数据类型称为拆箱。
3)在JDK1.5之后,提供了自动装箱和自动拆箱功能。
示例代码:
public class PrimitiveTypeTest {
public static void main(String[] args) {
// ===========包装类
// ‐‐提供一些实用的方法
String s = "123456";
int q = Integer.parseInt(s);
int t = Integer.valueOf(s);
System.out.println(t);
// 十进制转成十六进制:
System.out.println(Integer.toHexString(500));
// 十进制转成八进制
System.out.println(Integer.toOctalString(500));
// 十进制转成二进制
System.out.println(Integer.toBinaryString(500));
// 十六进制转成十进制
System.out.println(Integer.valueOf("FFFF", 16).toString());
// 八进制转成十进制
System.out.println(Integer.valueOf("776", 8).toString());
// 二进制转十进制
System.out.println(Integer.valueOf("0101", 2).toString());
// ‐‐自动装箱和自动拆箱
Integer int1 = t;
int int2 = int1;
// ===包装类的一些常用类变量
// byte
System.out.println(" 基本类型:byte 二进制位数:" + Byte.SIZE);
System.out.println(" 包装类:java.lang.Byte");
System.out.println(" 最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
System.out.println(" 最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
System.out.println();
// short
System.out.println(" 基本类型:short 二进制位数:" + Short.SIZE);
System.out.println(" 包装类:java.lang.Short");
System.out.println(" 最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);
System.out.println(" 最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);
System.out.println();
// int
System.out.println(" 基本类型:int 二进制位数:" + Integer.SIZE);
System.out.println(" 包装类:java.lang.Integer");
System.out.println(" 最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
System.out.println(" 最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
System.out.println();
// long
System.out.println(" 基本类型:long 二进制位数:" + Long.SIZE);
System.out.println(" 包装类:java.lang.Long");
System.out.println(" 最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
System.out.println(" 最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
System.out.println();
// float
System.out.println(" 基本类型:float 二进制位数:" + Float.SIZE);
System.out.println(" 包装类:java.lang.Float");
System.out.println(" 最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);
System.out.println(" 最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);
System.out.println();
// double
System.out.println(" 基本类型:double 二进制位数:" + Double.SIZE);
System.out.println(" 包装类:java.lang.Double");
System.out.println(" 最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
System.out.println(" 最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
System.out.println();
// char
System.out.println(" 基本类型:char 二进制位数:" + Character.SIZE);
System.out.println(" 包装类:java.lang.Character");
// 以数值形式而不是字符形式将 Character.MIN_VALUE 输出到控制台
System.out.println(" 最小值:Character.MIN_VALUE=" + (int) Character.MIN_VALUE);
// 以数值形式而不是字符形式将 Character.MAX_VALUE 输出到控制台
System.out.println(" 最大值:Character.MAX_VALUE=" + (int) Character.MAX_VALUE);
// boolean
System.out.println(Boolean.FALSE);
System.out.println(Boolean.TRUE);
}
}
4.3、类型转换
一、自动类型转换(隐式类型转换)
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
转换从低级到高级
自动转换有以下规律:
- 小的类型自动转化为大的类型
- 整数类型可以自动转化为浮点类型,可能会产生舍入误差
- 字符可以自动提升为整数
二、强制类型转换(显式类型转换)
格式: (type)value
type是要强制类型转换后的数据类型
注意:
- 强制类型转换可能导致溢出或损失精度
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换
- 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
public class ConvertType {
public static void main(String[] args) {
// =====自动类型转换(隐式转换)
// 小的类型自动转化为大的类型
byte byteValue1=110;
int intValue1=byteValue1+50;
System.out.println(intValue1);
// 整数类型可以自动转化为浮点类型,可能会产生舍入误差
// Float和Double提供了快速的运算,然而问题在于转换为二进制的时候,有些数字不能完全
float floatValue1=2+10f;
float floatValue2=floatValue1‐11.9f;
System.out.println(floatValue2);
// 字符可以自动提升为整数
char charValue1 ='a';
int intValue2=charValue1+10;
System.out.println(intValue2);
//======强制类型转换
//‐‐强制类型转换可能导致溢出或损失精度
//导致溢出
byte d = (byte) 128;
// 00000000 00000000 00000000 10000000 128的原码
// 00000000 00000000 00000000 10000000 128的反码
// 00000000 00000000 00000000 10000000 128的补码
// 10000000 的补码
// 11111111 反码
// 10000000
System.out.println(d);
/**
* 关于 原码,反码,补码的知识(了解)
* 正数的反码,补码是其本身;
* 负数的反码是符号位保持不变,其余位取反;负数的补码是在其反码的基础上+1
*/
//损失精度
System.out.println(Long.MAX_VALUE);
float floatValue3=(float) Long.MAX_VALUE;
System.out.println(floatValue3);
//‐‐在把容量大的类型转换为容量小的类型时必须使用强制类型转换
int intValueA=120;
byte byteValueB=(byte) intValueA;
System.out.println(byteValueB);
//‐‐浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
int intValue3=(int)23.7;
int intValue4=(int)‐23.7;
System.out.println(intValue3);
System.out.println(intValue4);
}
}