Java的数据类型有两类,一个是基本类型,还有一个是引用数据类型,今天我们先来来捣鼓捣鼓啥是基本数据类型。
首先看看数据类型有什么作用:
程序当中有很多的数据,每个数据都是有相关类型的,不同数据类型的数据占用空间的大小不相同,而数据类型的作用是知道Java虚拟机在运行程序的时候给该数据分配多大的内存空间
基本类型
Java基本类型有八种:
-
整数型
byte,short,int,long
字节:1 2 4 8 -
字符型
char
字节: 2 -
浮点型
float,double
字节:4 8 -
布尔型
boolean
字节:1
在这里1 byte = 8 bit,1bit就是代表一个二进制位
注意:字符串类型不是基本的数据类型比如“zxcnc123”,字符类型使用单引号’a’
计算机在任何的情况下只能识别的是二进制也就是0和1
引用数据类型:
数组,字符串,集合…
字面值
对于字面值来说,就是数据;
例如:
“a”,“abc”: 字符串字面值
‘a’,‘b’:字符型字面值
10,24,30:整数型字面值
true,false:布尔型字面值
数据类型的转换
数据类型之间的转换分为自动转换
和强制转换
,布尔类型不可进行类型的转换
低====================》高
byte short char int long float double
- 其中short与char要进行相互转换
- byte,short,char在运算的时候,会默认的转换为int
- 转换时应该注意精度问题
从高至低需要进行强制类型转换,比如经典的int转byte
public static void main(String[] args) {
int a = 128;
byte i = (byte)a;
System.out.println(i);
输出结果是-128,因此,在转换的同时也要注意到内存溢出溢出的问题,因为128已经超过byte所表示的范围了。
从低到高的数据类型的改变。就不需要进行强制转换了,此时程序会进行自动的数据类型转换。
还有注意的一点就是,浮点数与int类型之间的转换会导致精度丢失的问题:
public static void main(String[] args) {
float f = 2.34f;
int i = (int) f;
System.out.println(i);
此处代码中输出的i就是2,精度丢失问题需要注意!!!
再举一个 int 和 long 之间的问题:
public static void main(String[] args) {
int money = 20_0000_0000;//下划线是jdk7的特性,不影响输出结果
int year = 20;
System.out.println(year * money);//内存溢出
long total = money * year;
System.out.println(total);//还会出现内存溢出
long total2 =(long)money * year;
System.out.println(total2);//正确输出
}
第一个输出语句出现内存溢出,第二个语句在转换之前就出现了内存溢出所以要进行强制转换
Java中的进制表示
public class DataType {
public static void main(String[] args) {
//二进制表示以0b开头
int a = 0b11;
//八进制表示用0开头
int b = 011;
//十进制
int c = 10;
//十六进制表示用0x开头
int d = 0x10;
System.out.println(a);//3
System.out.println(b);//9
System.out.println(c);//10
System.out.println(d);//16
}
}
浮点数精度丢失
有关于钱的变量声明,不能用float,不然老板会打屎你哈哈
public class DataType {
public static void main(String[] args) {
//浮点数精度丢失
float f1 = 221342423242434f;
float f2 = f1 + 1;
System.out.println(f1 == f2);//true
从上面代码看出来,输出的结果是true,出现精度丢失的问题了,正确的应该使用BigDecimal
对象类型去修饰有关于钱的变量
字符扩展
关于Java中的char
基本数据类型,它占了两个字节,只能存储一个汉字或者一个数字,不管存的是什么其实底层本质就是数字,也就是说char
与数值之间可以进行常量之间的运算,就是表示字符的时候运算的是ASCII对应的值。
public class DataType {
public static void main(String[] args) {
char a = '1';
char b = '国';
char c = 'A' + 1;
char d = 'a';
System.out.println(a);//1
System.out.println(b);// 国
System.out.println((int)b);// 22269
System.out.println((int)c);// 66
System.out.println((int)d);//97
底层通过Unicode编码的,可以根据ASCALL对照表查出对应的值,比如a=97,A=65
转义字符表
转义字符 | 意义 | ASCII码值(十进制) |
---|---|---|
\a | 响铃(BEL) | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | 代表一个反斜线字符’’’ | 092 |
\’ | 代表一个单引号(撇号)字符 | 039 |
\" | 代表一个双引号字符 | 034 |
? | 代表一个问号 | 063 |
\0 | 空字符(NUL) | 000 |
\ddd | 1到3位八进制数所代表的任意字符 | 三位八进制 |
\xhh | 十六进制所代表的任意字符 | 十六进制 |
为何Java中编译和解释并存?(重要)
- 高级编程语言按照程序的执行方式分为编译型和解释型两种。
- 编译型语言是指编译器将源程序一次性翻译成可被该平台执行的机器码;(翻译与执行分开)
- 解释型语言是指解释器对源程序逐行解释成特定平台的机器码并立即执行。(翻译与执行一次执行)
- 比如,你想阅读一本英文名著,你可以找一个英文翻译人员帮助你阅读, 有两种选择方式,你可以先等翻译人员将全本的英文名著(也就是源码)都翻译成汉语,再去阅读,也可以让翻译人员翻译一段,你在旁边阅读一段,慢慢把书读完。
Java 语言既具有编译型语言的特征,也具有解释型语言的特征,因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(*.class 文件),这种字节码必须由 Java 解释器来解释执行。因此,我们可以认为 Java 语言编译与解释并存。