一、数据类型分类
之前说过Java是强类型语言,意思是所有的变量必须先声明后使用;指定类型的变量只接受与之匹配类型的值。
声明变量很简单,只要定义变量类型和变量名即可:
type varname[ = 初始值];
- 说明一下“变量”:编程的本质是对内存中数据的访问和修改。我们需要一种机制来访问或者修改内存中的数据,这种机制就是变量。每个变量都代表某一小块内存。我们对变量赋值就是把数据装入内存。通俗的理解,变量就是一种容器,来装不同类型的数据的。
- 变量的作用范围:成员变量和局部变量。
- 定义变量类型可以是Java支持的所有类型。
Java语言支持的类型:基本类型和引用类型
1.基本类型:boolean类型和数值类型(又分为整数型和浮点型)
2.引用类型:类、接口、数组类型和特殊的null类型。指的是对一个对象(包括数组和实例两种)的引用。实际上引用类型就是一个指针,只是Java语言里不再使用指针的说法。
注意:空引用只能被转换成引用类型,不能转换成基本类型,所以不要把null值赋给基本数据类型的变量。
二、基本数据类型
(一)整数int(-2^31~2^31-1)常用的整数类型,如果未指定类型,默认是int类型,所以有以下几点注意:
//1.下面代码正确,系统会自动把56当成byte类型处理
byte a = 56;
//2.下面代码错误,系统不会把999999999999当成long类型,即使超出int范围,所以出现错误
long bigValue = 999999999999;
//3.下面是正确表示,需要用l或者L强制转换,建议用L方便识别,不与I混淆
long bigvalue2 = 999999999999L;
//4.下面是正确的,在int的表数范围内,直接赋给long变量,Java依然会当成int处理,但是int可以自动类型转换到long类型
long demo = 999999999;
- 整数值的4种表示方式:十进制、二进制、八进制和十六进制
Java对二进制的支持:
public class IntegerValTest{
public static void main(String[] args){
int binVall = 0b110010100;
byte binVall2 = 0B01101001;
int binVall3 = 0B10000000000000000000000000000011;
System.out.println(binVall);
System.out.println(binVall2);
System.out.println(binVall3);
}
}
//结果是:
404
105
-2147483645
- 代码中变量binVall3定义的是32位二进制整数时,最高位是符号位:1代表-,0代表+;负数在计算机是以补码形式存在,因此要转换成原码。
联系前面所说:
/*
定义一个8位的二进制整数,数值默认占的是32位(int),因此是正数
只是强制转换的时候换成byte溢出,变成了-23
*/
byte binVal4 = (byte)0b11101001;
/*
定义一个32位的二进制整数,最高位是1,
由于加了L因此转换成long类型,占64位,因此第32位就不是符号位
所以是正数
*/
long binVal5 = 0B10000000000000000000000000000011L;
(二)字符型
- 字符集的概念:给所有的字符编号组成总和。因为计算机无法保存电影、音乐、字符…..计算机只能保存二进制码,因此需要把他们全都转换成二进制码。因为对于保存字符简单,所以就直接对字符进行编码,当要保存时,就将对应的字符的编号进行二进制的转换即可。
- 字符型必须用单引号括起来
三种表现形式:1.直接用单个字符表示字符型值,如‘A’、’9’;
2.通过转义符表示特殊字符,如‘\n’;
3.直接使用Unicode值表示字符型值,如‘\uXXXX’
由于计算机保存字符的时候,保存的是对应的编号,所以char的类型可以直接作为整数值来使用,相当于16位的无符号整数,表述范围为0~65535.
public class CharTest{
public static void main(String[] args){
char aChar = 'a';//直接指定单个字符作为字符值,输出就是a
char enterChar = '\t';//使用转义符
char ch = '\u9999';//使用Unicode编码
System.out.println(ch);
char feng = '疯';//定义一个疯字作为字符值
int fengValue = feng;//直接将char变量当成int变量来用
System.out.println(fengValue);
char c = 97;//直接把在char表数范围内的int数值赋给char变量
System.out.println(c);
}
}
结果是:
香
30127
a
- Java语言没有提供表示字符串的基本数据类型,而是通过String类表示字符串,需要用双引号括起来。
String s = "沧海月明珠有泪,蓝田玉暖日生烟";
(三)浮点型
- 类型:float(单精度浮点数,4字节、32位)和double(双精度浮点数,8字节、64位)。
- 表示的形式:1.十进制形式。如5.12、0.512,必须有一个小数点,否则就当成int类型;
2.科学计数法:5.12e2(就是5.12x10的2次方)。只有浮点类型的数值才能用科学计算方法。 - Java语言默认是double类型,如果要当成float类型,则必须加F或f。
- 三个特殊的浮点数值:正无穷大(POSITIVE_INFINITY)、负无穷大(NAGATIVE_INFINITY)和非数(NaN)。
- 注意只有浮点数除以0才可以得到正负无穷大,当然非数也适用,否则会出现报错。
具体例子:
public class FloatTest{
public static void main(String[] args){
//观察下面af的变化
float af = 5.2345556f;
double af1 = 5.2345556;
System.out.println(af);
System.out.println(af1);
double a = 0.0;
float af3 = -5.2f;
System.out.println(af/a);//正无穷大
System.out.println(af3/a);//负无穷大
System.out.println(a/a);//非数
System.out.println(0/0);//抛出异常
double c = Double.NEGATIVE_INFINITY;
float d = Float.NEGATIVE_INFINITY;
System.out.println(c==d);//float和double的无穷大相等
System.out.println(a/a==Float.NaN);//两个非数不相等
System.out.println(6.0/0==55.0/0);//所有正无穷大相等,适用于负无穷
}
}
结果:
5.2345557
5.2345556
Infinity
-Infinity
NaN
Exception in thread "main" java.lang.ArithmeticException: / by zero
at FloatTest.main(FloatTest.java:12)
true
false
true
出现的错误:
错误: 不兼容的类型: 从double转换到float可能会有损失
float af1 = 5.2345556;
解决:涉及到下一个知识点类型的转换,详细的以后说,这里修改把float变成double,因为本来就是想定义一个double类型。
(四)数值下面使用下划线分隔
作用:更直观的查看数值多的位数
int binVal = 0B1000_0000_0000_0000_0000_0000_0000_0000;
double pi = 3.14_15_92_65_36;
(五)布尔型
只能用字母表示的true和false,占用8位。
public class BooleanTest{
public static void main(String[] args){
boolean b1 = true;
System.out.println(b1);
String str = true+"";
System.out.println(str);
}
}
结果是true true;
- 从结果上可以得出啊,虽然说其他基本类型数值不能转换成为boolean型,但字符串”true”和”false”可以间接的通过一个boolean值和字符串进行连接运算,那么boolean值可以转换成字符串。
这里插入一个自己的理解:
如刚才那个 String str = true+”“;
=后面有true是boolean类型的,如果要将自己赋值给前面的String类型的str变量,就不仅要将自己的值还要将自己的类型都转换成与String类型相符的,因此true需要转换成字符串类型才能进行赋值。
- 控制的流程:
1.if条件控制语句;
2.while循环控制语句;
3.do循环控制语句;
4.for循环控制语句;
5.三目运算符(?:)