一. 数据类型
整型 byte short int long
小数 float double
字符 char
布尔 boolean
1.不论在16位,32位还是64位系统,int都占用4个字节,long都占用8个字节
👆可移植性,可以跨平台运行,“一次编译,到处运行”
2.在Java中,整型和浮点型都是带有符号的
以字节型来举例:一个字节8个bit位,第一个bit位是符号位,不计入数值
所以一共有7个bit位是数值位
所以范围是-2^7~2^7-1 -128~127
3.整型默认int型,浮点数类型默认为double类型
4.引用数据类型 String 数组 类 接口
二.变量
1.语法格式
数据类型 变量名 = 初始值;
Java当中局部变量在使用的时候必须初始化
public class Test {
public static void main(String[] args) {
int a = 10; // 定义整形变量a,a是变量名也称为标识符,该变量中放置的值为10
double d = 3.14;
char c = 'A';
boolean b = true;
System.out.println(a);
System.out.println(d);
System.out.println(c);
System.out.println(b);
}
}
2.整型变量
注意:
1.无论在任何系统下,int都是4个字节
2.int的包装类型是Integer
注意:包装类型只针对基本数据类型,String不是包装类型
3.给变量设置初始值(字面值常量)时,注意不要超过int的范围
//int类型的范围
public class Test {
public static void main(String[] args) {
System.out.println(Integer.MIN_VALUE);//-2147483648
System.out.println(Integer.MAX_VALUE);//2147483647
}
}
3.长整型变量
long a = 10L;
System.out.println(a);
System.out.println(Long.MAX_VALUE);//9223372036854775807
System.out.println(Long.MIN_VALUE);//-9223372036854775808
1.长整型初始值后面加L(推荐,为了区分int和long两个类型)
2.long包装类型是Long
3.任何系统都是8个字节
4.短整型变量
System.out.println(Short.MIN_VALUE);//-32768
System.out.println(Short.MAX_VALUE);//32767
注意:对于byte,short这类小于4个字节的赋值的字面值,没有超过最大范围的时候,不会被解析为整型
5.字节型变量
System.out.println(Byte.MIN_VALUE);//-128
System.out.println(Byte.MAX_VALUE);//127
为什么127+1 = -128呢
因为把加之后的数据存到不能存128这么大的变量里面,所以数据溢出
回归这个经典的图
6.浮点型变量
1.除法
在Java中,int除以int的值仍然是int(会直接舍弃小数部分),要得到0.5需要使用double类型计算
2.乘法
double num = 1.1;
System.out.println(num * num); // 输出1.21吗?
// 执行结果
1.2100000000000002
浮点数没有一个非常精确的数字,没法精确到小数点后几位,只能是一个近似值
3.浮点数与整数在存储方式上有很大不同,不是单纯用2^n来存就行
分为符号位,指数位,尾数(参考 不能错过的数据在内存中的存储剖析)
4.单精度浮点类型
float f = 12.5f;//加这个f把8个字节转换成4个字节
7.字符类型变量
char ch = '呵';
System.out.println(ch);
Test.java:3: 错误: 未结束的字符文字
char ch = '鍛?';
^
javac -encoding UTF-8 Test.java
char的包装类型为Character
8.布尔型算法
1.boolean类型只有两种取值,true表示真,false表示假
2.Java 的 boolean 类型和 int 不能相互转换, 不存在 1 表示 true, 0 表示 false 这样的用法.
boolean value = true;
System.out.println(value + 1);
// 代码编译会出现如下错误
Test.java:4: 错误: 二元运算符 '+' 的操作数类型错误
System.out.println(value + 1);
^
第一个类型: boolean
第二个类型: int
1 个错误
三.类型转换
int a = 10;
long b = 100L;
b = a; // 可以通过编译
a = b; // 编译失败
不同类型的变量相互赋值需要进行类型转换
1.自动类型转换
程序自动转换
float f = 3.14F;
double d = 5.12;
d = f; // 编译器会将f转换为double,然后进行赋值
f = d; // double表示数据范围大,直接将float交给double会有数据丢失,不安全
2.强制性类型转换
float f = 3.14F;
double d = 5.12;
d = f; // float-->double,数据范围由小到大,隐式转换
f = (float)d; // double-->float, 数据范围由大到小,需要强转,否则编译失败
后果:可能会丢失数据,会产生意想不到的问题
3.类型提升
不同类型数据进行计算时,范围小的类型会被提升为范围大的类型
int 和 long
int a = 10;
long b = 20;
int c = a + b; // 编译出错: a + b==》int + long--> long + long 赋值给int时会丢失数据
//int c = (int)(a+b) 可以这么改,但是会数据丢失
long d = a + b; // 编译成功:a + b==>int + long--->long + long 赋值给long
byte和byte
由于CPU通常按照4个字节为单位从内存中读写数据,低于4个字节的类型会先提升成int再计算
a + b得到的结果会被类型提升,得到的是int类型,与前面的byte不符合,产生错误.
//修改1
int c = a + b;
//修改2
byte c = (byte) (a + b);
四.String
String str = "hello";
System.out.println(str);
System.out.println(str.length());//输出长度,5
这个字符串以什么结尾?
答案:没有,这不是我们C语言所说的\0结尾,这个hello底层是一个数组
int和string类型转换
String str2 = "345";
int val = Integer.valueOf(str2);
//int val = Integer.parseInt(str2);
System.out.println(val+1);//346
int p = 100;
String str3 = String.valueOf(p);
System.out.println(str3);//100
拼接符号
当一句话里面有出现字符串和+,这里的+一般是拼接作用
小测试
System.out.println(a+b + "a + b ");//?
System.out.println("a + b = "+a+b);//?