目录
大家好!这里是困了电视剧!今天我们来对java中较为基础的知识进行一个简单的梳理。正所谓,千里之行,始于足下。打好基本功是一件很重要的事,话不多说,让我们开始吧!
数据类型
java中的数据类型分为两大类,一类是基本数据类型,一类是引用数据类型。至于为什么会分成这两类,与java对内存的划分有关,我会在我后面的博客中为大家详细的讲解。
基本数据类型
基本数据类型分为四类:整型、浮点型、字符型以及布尔型。
这四类又可以分为八种,每一种都有各自的定义,我上一张图供大家参考:
引用数据类型
引用数据类型分三种:类、接口、数组,他们之所以被称为引用数据类型主要和他们的分配空间有关,这个我在后面的博客会单独拿出来详细的说明。
字面常量
常量即程序运行期间,固定不变的量称为常量,在一个输出“Hello World”程序中System.Out.println("Hello World"); 语句,不论程序何时运行,输出的都是Hello World,其实"Hello World"就是字面常量。
这里有一个关于字面常量的小知识点:我们都知道整型变量都有一个范围,在Java中当我们直接给一个整型变量赋一个超出他范围的字面常量时,Java就会报错
public class Javabit_Code {
public static void main(String[] args) {
int a = Integer.MAX_VALUE;
System.out.println(a);
int b = 2147483648;
}
}
由于int型变量占4个字节,每个字节占8个bit位,所以他的最大值是2的31次方,当我们直接给b赋2147483648(2的31次方+1)时,编译器就会报错:
这就是Java的安全性!即你可以完全相信Java!
但是,我在测试的时候我又发现了一个问题:
public class Javabit_Code {
public static void main(String[] args) {
int a = Integer.MAX_VALUE;
System.out.println(a);
int b = 2147483647+1;
System.out.println(b);
}
}
我所做的操作仅仅是将2147483648换成2147483647+1,但是这样就不会报错并且b的输出结果会按照补码相关的规则进行输出。
这是什么原因呢?原来在Java中如果给一个变量直接赋一个字面值常量的话,它会进行检查,如果超出了就会报错,所以当我们换成2147483647+1后他就不在是一个字面值常量,所以他不会先检查,他会先计算,根据计算结果用补码的相关规则进行赋值。
变量
整型变量
整型变量根据范围不同可以分为四类:整型变量,长整型变量,短整型变量和字节变量。
整型变量
用int关键字定义的变量,其由四个字节构成。
长整型变量
用long关键字定义的变量,其由八个字节构成。
短整型变量
用short关键字定义的变量,其由两个关键字构成。
字节变量
用byte关键字定义的变量,其由一个字节构成,在整型变量中范围最小。这里面有一个小知识点;
public class Javabit_Code {
public static void main(String[] args) {
byte a=50;
byte b=60;
byte c=a+b;
}
}
看这段代码,乍一看好像没什么问题,但编译器却报错了、
这是什么原因呢?原来byte型的变量在进行计算时,会先把byte型变量转换成int型变量,所以a+b计算出来结果是int型不能用byte型的c进行接收。
浮点型变量
双精度浮点型
用double关键字定义的变量。
单精度浮点型
用float关键字定义的变量,在定义float变量时,需要数字后面加一个f,否则编译器会默认为double型变量,进而使程序报错。
字符型变量
Java中字符型变量用两个字节来存储,这就使可以表示的字符的种类变的更多,java中使用Unicode字符集,他包含了所有的ASCII中的所有字符,同时也可以表示其他很多字符。
布尔型变量
用boolean关键字定义的变量,用来表示对错,没有明确规定其内存占用情况。
类型转换
讲到变量类型,那就不得不说类型转换的相关知识了。类型转换主要分为两种,一种是自动类型转换(隐式),一种是强制类型转换(显示)。
自动类型转换(隐式)
自动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。特点:数据范围小的转为数 据范围大的时会自动进行。
就比如在这段代码中int型的变量c比byte型的变量a范围更大,所以就可以直接赋值,编译器会自动地帮你进行类型转换。
强制类型转换(显式)
强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。特点:数据范围大的到数据范围小 的。
注意事项: 1. 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型
2. 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失
3. 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查
4. 强制类型转换不一定能成功,不相干的类型不能互相转换
类型提升
不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。
当各种类型的一堆数据进行运算时,编译器会将范围小的提升成范围大的以达到方便运算的目的,同时由于计算机的CPU都是按四个字节进行读写的,所以在面对大小小于四个字节的类型变量时,比如byte型和short型会将他们提升至四个字节进行运算,其结果自然是四个字节。
好了,以上就是关于类型相关的知识,虽然知识较为基础,但将它们整理出来也是对日后的学习有很大的好处的,如有疏漏还请各位大佬指出!