java 的两大数据类型
- 内置数据类型
- 引用数据类型
1. 内置数据类型
Java 语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
整数的默认类型是 int。
定义 long 数据时,必须加后缀l或L。
在定义 float 类型时必须在数字后面跟上 F 或者 f。
byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。当使用常量的时候,前缀0表示8进制,而前缀0x代表16进制。
自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下:
低--------------------------------------------->高
byte->short->char-> int -> long -> float -> double
- 合法转换
虚箭头表示可能会损失精度。
强制转换的格式是在需要转型的数据前加上“( )”,然后在括号内加入需要转化的数据类型。Math.round()可以将浮点数舍入到最接近的整数,不过其返回值为long类型。
基本数据类型中,布尔类型boolean占有一个字节,由于其本身所代码的特殊含义,boolean类型与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换), 否则,将编译出错。
byte:
- byte数据类型是8位、有符号的,以二进制补码表示的整数(四个整数型之一);
- 最小值是-128(-2^7);
- 最大值是127(2^7-1);
- 默认值是0;
- byte类型用在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int类型的四分之一;
- 例子:byte a = 100,byte b = -50。
boolean:
- boolean数据类型表示一位的信息;
- 只有两个取值:true和false;
- 这种类型只作为一种标志来记录true/false情况;
- 默认值是false;
- 例子:boolean one = true。
对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。如:
public class PrimitiveTypeTest{ public static void main(String[] args){ 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(); } }
但是实际的运行并不顺利,报错说“编码GBK的不可映射字符”。学了点Python来着,好像要指定用 UTF-8 编码,于是就加了句
# -*- coding: utf-8 -*-
,然而果然还是不行啊,天真。百度了一下,大概是编译.java时,如果没有用-encoding utf-8
这样指定编译的编码格式的话,javac.exe会按照我们系统默认的编码格式来编译。这样,如果你.java的编码和OS默认的编码不一样的话,当然会出现乱码。原来在VSCode是用utf-8编码保存的.java文件,编译时加上参数-encoding utf-8
,就可以正确编译运行。或是在VSCode把.java文件改成用GBK编码来保存,也可以正确的编译运行。运行结果:
2. 引用类型
- 在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如Employee、Pubby等。变量一旦声明后,类型就不能被改变了。
- 对象、数组、接口都是引用数据类型。
- 所有引用类型的默认值都是null。
- 一个引用变量可以用来引用与任何与之兼容的类型。
参考资料
- 菜鸟教程:java 基本数据类型
- Java核心技术 卷Ⅰ基础知识 原书第8版