如有问题,欢迎指正!!!
Java是一种强类型语言,这就意味着必须为每一个变量声明一种类型。
Java中的数据类型主要分为两大类,即八大基本数据类型和引用数据类型两大类。
这次主要说一下基本数据类型,关于引用数据类型,以后会详细补充。
下面可以用一张图来表示数据类型的划分情况:
1. 所有数据类型均有默认值
整型默认值:0 浮点型默认值:0.0 字符型默认值:\u0000(空格)
布尔型默认值:flase 引用数据类型默认值:null
下面先看一段代码:
public class MoRenZhi {
public static void main(String[] args) {
int num; // 定义一个整型变量但并未赋值
System.out.println(num);
}
}
PS C:\Users\Lenovo\Desktop\1-5> javac -encoding UTF-8 MoRenZhi.java
MoRenZhi.java:5: 错误: 可能尚未初始化变量num
System.out.println(num);
^
1 个错误
这时弹出了一个错误,num尚未初始化,可是我们刚刚说过了所有的数据类型都有默认值的。那么这是为什么呢?
这是因为默认值必须结合类(class)来观察,函数中的临时变量(本题中则是num)不存在默认值,必须先赋值后使用。
解决方法:一种是在使用前进行赋值,另一种是在定义变量时赋值。
例如:下面是在使用前赋值的代码,在定义变量时赋值就不再赘述了,直接在定义临时变量时进行赋值就好了。
class Test {
public int a;
}
public class Test {
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.a);
}
}
2.整型:
在java中,任何一个整型常量都是一个int类型。
下面同样写一段代码:
public class Test {
public static void main(String[] args) {
int maxValue = Integer.MAX_VALUE;
int minValue = Integer.MIN_VALUE;
long num1 = maxValue + 1;
long num2 = minValue - 1;
System.out.println(num1);
System.out.println(num2);
}
}
PS C:\Users\Lenovo\Desktop\1-5> javac -encoding UTF-8 Test.java
PS C:\Users\Lenovo\Desktop\1-5> java Test
-2147483648
2147483647
这里显然int型数据出现了溢出问题,所以整型最大值加一便变成了整型最小值,整型最小值减一便变成了整型最大值。
这是因为存在符号位的问题。当数据类型达到最大值时,换一个保存范围更大的类型来解决数据溢出问题。
那么既然int型产生了数据溢出问题,那么唯一的办法就是更换数据类型,换成保存范围更大的long型。
public class Test {
public static void main(String[] args) {
int maxValue = Integer.MAX_VALUE;
int minValue = Integer.MIN_VALUE;
long num1 = maxValue + 1;
long num2 = minValue - 1;
System.out.println(num1);
System.out.println(num2);
}
}
PS C:\Users\Lenovo\Desktop\1-5> javac -encoding UTF-8 Test.java
PS C:\Users\Lenovo\Desktop\1-5> java Test
-2147483648
2147483647
运行结果依旧是错误的,这是什么原因呢?
原因是所有的程序执行顺序都是从右向左执行的,maxValue + 1已经溢出了,这时都已经变成整型最小值了,然后再把它保存在
long型里面已经为时已晚了。
正确的解决方法是:int + long = long 就会解决int型数据溢出问题。
java中声明一个long常量,需要在数字后加上一个L或l。
public class Test {
public static void main(String[] args) {
int maxValue = Integer.MAX_VALUE;
int minValue = Integer.MIN_VALUE;
long num1 = maxValue + 1L;
long num2 = minValue - 1L;
System.out.println(num1);
System.out.println(num2);
}
}
PS C:\Users\Lenovo\Desktop\1-5> javac -encoding UTF-8 Test.java
PS C:\Users\Lenovo\Desktop\1-5> java Test
2147483648
-2147483649
需要注意的一点是:
在进行数学计算中(+ - * / %),小的数据类型自动转换成大的数据类型,
而大的数据类型变成小的数据类型必须强制类型转换,但是可能会溢出。
既然说到了整型数据,就不得不提到byte,byte类型保存的范围是:-128~127
byte与int:
当整型常量在byte保存范围内时,可以直接赋值给byte变量;
除此之外(常量大小超出byte范围或者int变量赋值给byte变量)所有赋值必须强转。
① byte data = 10 ; // 10是int类型,在byte范围内,不用强转
② int num = 10;
byte data = (byte)num; // int变量赋值给byte变量,需要强转 结果:10
③ byte a = (byte) 300; // 常量超出byte范围,必须强转 结果:44 (直接舍弃多余的位数)
3.浮点型:
java 中,所有小数常量都是double类型。
float保存范围小于double,如果要使用float,必须强制类型转换,要声明一个float变量,在变量后加F或f。
进行小数运算时,若出现个别情况的精度丢失,将double变为float解决。最终解决:使用BigDecimal类。
这里需要注意的是:
int numA = 10 ;
int numB = 4 ;
System.out.println(numA/numB) ;
输出结果是:2
这是因为int/int型还是int型,向下取整结果就是2了。
解决方法:
System.out.println(numA/(double) numB) ;
如果要想准确计算,必须将其中一个变量变为double类型。
4.字符型:
字符型使用char来表示,使用' '表示字符常量。char与int可以相互转换(ASAII码)。
public class FirstDemo {
public static void main(String[] args) {
char c = 'A';
// char + int = int
int num = c + 32;
// 小类型变大类型自动提升,大类型变小类型必须强转
char x = (char)num;
System.out.println(x);
}
}
需要明白的是:字符型与int型一定不相等!!
下面可以用一段代码来验证:
public class FirstDemo {
public static void main(String[] args) {
if('0' == 0) {
System.out.println("相等!");
} else {
System.out.print("不相等!");
}
}
}
PS C:\Users\Lenovo\Desktop\1-5> javac -encoding UTF-8 FirstDemo.java
PS C:\Users\Lenovo\Desktop\1-5> java FirstDemo
不相等!
Java采用Unicode编码(支持世界上所有的语言),其他语言(C/C++)采用ASCII编码(不支持中文)。
Java中一个字符两个字节,与是否是英文无关!!!!
5.布尔型:
在其他语言中没有提供布尔类型,因此用0和1表示真假
java不用0和1表示真假,表示真用true,表示假用flase。