- 一个程序就是一个世界。
- 变量是程序的基本组成单位。
- 变量有三个基本要素:类型,名称,值。
笔记来源:韩老师的Java教学视频
推荐给每一个人,老师讲解的十分完善。
一。变(变化)量(值)
- 相当于内存中一个数据存储空间的表示,通过变量名可以访问到变量(值)
- 基本步骤:
- 声明:int a;
- 赋值:a = 1;
- 使用:println(a);
一步完成:int a= 1;
- 注意事项:
- 不同变量,类型不同,占用的空间大小不同
- 变量必须先声明,后使用
- 该区域的数据可以再同一类型范围内不断变化
- 变量在同一个作用域内不能重名
二。+号使用:
- 当左右两边都是数值型时,则作加法运算
- 当左右两边有一方为字符串,则做拼接运算
- 运算顺序从左到右
- 例:println(“abc“ + 100 + 3)输出:abc1003
三。数据类型(背诵):
- String(字符串)是一个类,不属于基本数据类型
- 字节:一个字节是八个二进制位,最高位是符号位,剩下七位是数值位,所以八个二进制位最大是七个1,转化为十进制是127(补码)。
- 四个字节为三十二个二进制,因为二进制是由2的0次方开始的,所以是最高位为符号位舍去且包含负数,7+8+8+8一共[-(231)~231-1]个字节。
- 基本数据类型有固定的范围和字段长度,不会因为操作系统的改变而改变
四。数值型
(一)。整型
类型 | 名称 | 范围 |
---|
byte | 字节 | -128~127 |
short | 短整型 | -(215)~215-1 |
int | 整型 | -(231)~231-1 |
long | 长整型 | -(263)~263-1 |
- Java的整数常量(具体值)默认为int型,声明long型常量须后加“l“或”L“
- long存储时后面不加L可以使用,Java底层会自动转化为int的范围,但是当long存储的值超出了2的31次方时也就超出int范围时,不加L会报错
- 把具体数值赋给byte时,先判断是否在byte范围内,否为int类型,会报错,
例:
byte b1 = 10; //正确
byte b2 = 128; //错误 - 因为小数都是近似值,向下转型会产生丢失精度的问题,而整型常量是准确值,所以double不能赋予float,int可以赋予byte
(二)。浮点类型
类型 | 名称 | 范围 |
---|
float | 单精度 | 4字节 |
double | 双精度 | 8字节 |
- 表示一个小数
- 浮点数 = 符号位 + 指数位 + 尾数位
- 尾数部分可能丢失,造成精度损失,double空间是8,float空间是4,因为小数都是近似值,不同进制的转换是自带乘除的,整数间的转换除到1就结束,必然能除尽,而小数多数情况下都是除不尽的,所以向下转型会产生丢失精度的问题
- 浮点型常量默认为double型,声明float型常量,须后加“f”或“F“。例:定义一个1.4,编译器读到1.4,但是不知道1.4后面还有几位,所以要加f来证明为float类型
- 表现形式:
- 十进制数形式:5.12、5.2f、.512(0可以省略,必须有小数点)
- 科学计数法形式:5.12e2、5.12e-2
- 当我们对运算结果为小数的数进行相等判断时,可能会得到不一致的结果,要小心
代码理解:
public static void main(String[] args){
double num1 = 2.7;
double num2 = 8.1 / 3;
System.out.println(num1);
System.out.println(num2);
if(num1 == num2) {
System.out.println("相等");
}
if(Math.abs(num1 - num2) < 0.00001) {
System.out.println("相等");
}
}
(三)。字符类型
- 可以表示单个字符,字符类型为char,多个字符用String表示
- 字符常量是用单引号(’ ')括起来的单个字符,例:char c1 = ‘a’
- Java允许使用转义字符,例:char c2 = ‘\n’
- char的本质是整数,赋予中文字符时,输出整数
- 可以给char赋一个整数,输出时,会按照对应的Unicode码对应的字符
- Char类型是可以运算的,相当于一个整数,都有对应的Unicode码值。但整数超过范围会报错
- 代码理解:
public static void main(String[] args){
char c1 = 'a';
char c2 = 97;
char c3 = 'a' + 2;
System.out.println(c1);
System.out.println(c2);
System.out.println(int(c2));
System.out.println(c3);
}
- 本质:字符型存储到计算机中,需要将字符对应的码值(整数)找出来,比如’a’
- 存储:‘a’ == > 码值(97) ==> 二进制(0110 0001) ==> 存储
- 读取:二进制(0110 0001) ==> 97 ==> ‘a’ ==> 显示
- 字符和码值的对应关系是通过字符编码表决定的
- ASCII码:
一个字节表示,但只使用了128个字符,美国 - Unicode:
固定大小的编码,字母和汉字都是占用两个字节,浪费空间。兼容ASCII码表 - utf-8:
大小可变的编码,字母使用一个字节,汉字使用三个字节。
是互联网使用最广的一种Unicode的实现方式(改进),可以使用1-6个字节表示一个符号,根据不同的符号变化字节长度 - gbk:
可以表示汉字,字母使用一个字节,汉字使用两个字节 - gb2312:
可以表示汉字,范围小于gbk - big5码:
繁体中文,台湾,香港
(四)。布尔类型
- 数据只允许取值false和true,无null
- 适于逻辑运算,一般用于程序流程控制,例:if条件控制语句,for循环控制语句
- Java内不可以用0或非0的整数替代false和true
五。基本数据类型转换
(一)。自动类型转换
- 当Java程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型
- 数据类型按精度(容量)大小排序为:
例:int num = ‘a’//结果为97 - 使用和细节
- 自动提升原则:表达式结果的类型自动提升为操作数中最大的类型
多种类型的数据混合运算时,系统首先将所有数据转换成容量大的数据类型,再进行计算
例:
int n1 = 10;
float f1 = n1 + 1.1; //错误,1.1是double类型,计算结果也为double,会造成精度损失
float f1 = n1 + 1.1F; //正确 - 编译器规定:(byte,short)和char之间不会相互转换
- 编译器规定:byte,short,char三者可以相互计算且只要参与运算,计算时首先转换为int类型
例:
byte b1 = 1;
byte b2 = 2;
short s1 = 1;
short s2 = b1 + s1;//错误,结果为int
byte = b1 + b2;//错误,结果为int - boolean类型不参与转换
(二)。强制类型转换
- 自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型,使用时要加上强制转换符(),但有可能造成精度降低或溢出,要小心使用
public static void main(String[] args){
int n1 = (int)1.9;
System.out.println(n1);
int n2 = 2000;
byte b1 = (byte)n2;
System.out.println(b1);
}
n2内的2000是以二进制的方式存储的,int有4个字节,砍掉3个变成byte,前面三个字节的数据就没了
- 细节说明
- 当进行数据大 ==> 小的类型转换时,就需要用到强制类型转换
- 强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
例:
int x = (int)10 * 3.5 + 6 * 1.5;
//错误,int只会强制转换是10,之后再进行数值运算,因为有小数,结果为double
int x = (int)(10 * 3.5 + 6 * 1.5);
//正确,会先进行括号内运算,再进行转换 - byte,short,char类型在进行运算时,当作int处理
(三)。基本数据类型和String类型的转换
- 基本类型转String类型
语法:基本类型的值 + “” 即可
例:
int n1 = 1000;
String s1 = n1 + “”; - String类型转基本数据类型
- 语法:通过基本类型的包装类调用parseXX方法即可
例:
public static void main(String[] args){
int n1 = Integer.parseInt("123");
double d1 = Double.parseDouble("123a");
boolean b1 = Boolean.parseBoolean("123a");
System.out.println(n1);
System.out.println(d1);
System.out.println(b1);
}```