Java学习笔记第二天
第一章 数据类型和变量
1.1 数据类型分类
-
基本数据类型(今天的重点,4类8种)
整数型:byte short int long
浮点型:float double
字符型:char
布尔型:boolean -
引用数据类型(以后的重点)
字符串、数组、类、接口、Lambda
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
字节型 | byte | 1个字节 | -128~127 |
短整型 | short | 2个字节 | -32768~32767 |
整型 | int(默认) | 4个字节 | -231~231-1 |
长整型 | long | 8个字节 | -263~263-1 |
单精度浮点数 | float | 4个字节 | 1.4013E-45~3.4028E+308 |
双精度浮点数 | double(默认) | 8个字节 | 4.9E-324~1.7977E+308 |
字符型 | char | 2个字节 | 0~65535 |
布尔类型 | boolean | 1个字节 | true,false |
注意:
1.字符串不是基本类型,而是引用类型。
2.浮点型只是一个近似值,并非精确的值。
3.数据范围与字节数不一定相关,比如float要比long范围更广,但是float是4字节,而long是8字节。
4.浮点数当中默认类型是更加精确的8字节double,如果要使用float类型,需要加上后缀F(大小写都可,推荐大写)。
如果是整数,默认类型是4字节int类型,如果要使用long类型,需要加上后缀L(大小写都可,推荐大写)
5.后面所学的null值,是空的意思,而null是不能调用任何非静态方法和属性的。
1.2 变量
定义:程序运行期间可以改变的量
创建一个变量: 数据类型 变量名称
给变量赋值: 变量名称 = 数据值
一步到位的格式: 数据类型 变量名称 = 数据值 。如 int num1 = 8
注意:
1.对变量所赋数值不能超过变量类型的取值范围,这点对于byte和short类的整型需要尤其注意
2.在使用long和float类型时候,不要忘记加后缀L和后缀F。如long num2 = 10000000000L
3.在创建多个变量时,变量名称不能重复
4.没有进行赋值的变量无法直接使用,必须赋值后才可使用
5.变量使用不能超过其作用域
作用域: 从定义变量的一行开始,一直到所属的大括号结束为止。
6.可以通过一个语句来创建多个变量后续,再分别进行赋值,但是一般情况下不推荐这么写。如:
int a,b,c;
a=10;
b= 20;
c = 50;
System.out.println(a);
System.out.println(b);
System.out.println(c);
也可直接创建多个带有初始值的同类型变量。如:
int x = 10;y = 20;z = 50
System.out.println(x);
System.out.println(y);
System.out.println(z);
1.3数据类型转换
当数据类型不一致时侯,将会发生数据类型的转换
1.3.1 自动类型转换(隐式)
1.特点:代码不需要进行特殊处理,自动完成。
2.规则:数据范围从小到大,这与该数据类型所占据的内存字节数是无关的
如:
// 左边定义类型为long类型,右边是默认的int类型
// 一个等号代表赋值,将右边的int常量,交给左侧的long变量进行存储
// int ---> long,符合了数据范围从小到大的要求
// 这一行代码发生了自动类型转换
long num1 = 100
// 左边定义类型为float类型,右边是默认的double类型,不符合数据范围从小到大的要求,故下面这行代码错误
float num2 = 3.14
// 左边定义类型为float类型,右边是Long类型
// float类型占4个字节,long类型占8个字节,但float类型的数据范围比long类型的数据范围大
// long ---> float,符合了数据范围从小到大的要求
float num3 = 30L
1.3.2 强制类型转换(显式)
1.特点:代码需要进行特殊处理,无法自动完成
2.格式:范围小的类型 范围小的变量名 = (范围小的类型)原本范围大的数据;
如:
// 由于long类型的数据范围比int类型的数据范围大,故不符合自动类型转换中的规则,下面代码错误
int num = 100L
// 对上面代码修改为强制类型转换
int num = (int) 100L
1.3.3 数据类型转换的4个注意事项
1.强制类型转换一般不推荐使用,因为可能会发生数据精度损失、数据溢出
// long ---> int的强制转换
// 此时发生了数据溢出
int num2 = (int) 6000000000L;
System.out.println(num2); // 1705032704
// double ---> int的强制转换
// 此时发生了精度缺失
int num1 = (int) 3.5; // 3,这并不是四舍五入,所有的小数位都会被舍弃掉
2.byte/short/char这三种类型都可以发生数学运算,例如加法"+"
// 计算机的底层会用一个数字(二进制)来代表字符,如字符'A', 就是65
// 一旦char类型进行了数学运算,那么字符就会按一定的规则翻译为一个数字
char zifu = 'A';
System.out.println(zifu + 1); // 66
3.byte/short/char这三种类型在进行运算的时候,都会被首先提升成为int类型,然后再计算
如:
byte num3 = 40; // 注意!右侧的数值不能超过左边的数据类型范围
byte num4 = 50;
//下面一行代码错误,原因在于num3和num2两个byte类型在做数学运算时被提升为int类型,相加结果也是int类型,
//无法用byte类型定义变量接收int类型的结果,也不满足隐式类型数据转换的条件。
// byte result = num3 + num4
// 代码修改为
int result = num3 + num4
short num6 = 60;
// byte + short ---> int + int ---> int
// int强制转换为short
// 注意必须保证逻辑上真实大小本来没有超出short范围,否则会发生数据溢出或精度缺失
short result2 = (short)(num4 + num6);
System.out.println(result2) // 100
4.boolean类型不能发生数据类型的转换,也不能看作0、1进行数学运算(这点与python不同)
1.3.4 ASCII码表
由于计算机内部实际上只有0和1,故需要有一种对应法则将字符与之对应
编码表:将人类的文字和一个十进制数进行对应组成了一张表格
- ASCII码表:
American Standard Code for Information Interchange美国信息交换标准代码 - Unicode码表:
万国码,也是数字和字符的对照关系,并且开头0-127部分和ASCII码表完全一样,但是从128开始包含有更多的字符
ASCII码表重点关注以下几个即可
字符 | 数值 |
---|---|
‘0’ | 48 |
‘9’ | 57 |
A | 65 |
Z | 90 |
a | 97 |
z | 122 |
注意:
ASCII码表中的字符’0’是字符型变量,是char类型,不是整型的数字0,计算机底层存储数字时候按照二进制存储,但是在存储字符型变量时候,是先找到字符对应的码表中的十进制数据,然后用二进制表示这个十进制数据
简单示范举例:
public class Demo02TypeChar{
public static void main(String[] args);{
char zifu1 = 'c';
// 左边类型为int,右边是char类型,符合数据范围从小到大的自动类型数据转换的条件
int num = zifu1;
System.out.println(num);// 输出结果是97 + 2 = 99
}
}
第二章 运算符
2.1 算术运算符
算术运算符:+、-、*、/、%、++、–
2.1.1 除法/:
被除数 / 除数 = 商…余数
对于一个整数的表达式来说,除法用的是整除,整数除以整数,结果仍然是整数,只看商,不看余数
int x = 10;
int y = 3;
int result = x / y;
System.out.println(result); // 结果为商,即3
2.1.2 取模%:
只有对于整数的除法来说,取模运算才有余数的意义
int x = 10;
int y = 3;
int result = x % y;
System.out.println(result); // 余数,模,结果为1
注意事项:
1.一旦运算当中有不同类型的数据,那么结果就是数据类型范围大的那种,但是注意byte、short、char在进行运算时一定是先化为int类型,然后再进行计算
int x = 10;
// int + double ---> double + double ---> double
double y = x + 2.5
System.out.println(y); // 结果为12.5
2.1.3 加号的3种用法:
1.对于数值来说就是加法
2.对于字符char来说,在计算之前char类型数据会按照ASCII码表或Unicode表转换成相应的int型数据,然后再进行数学计算
3.对于字符串String(String并不满足全是小写字母,因此这不是关键字,也不是基本数据类型)来说,加号代表字符串的连接操作
注意:
任何数据类型在和字符串进行连接的时候,结果都会变成字符串
public class Demo05Plus{
public static void main(String[] args){
// 字符串类型变量的基本使用
// 数据类型 变量名称 = 数据值;
String str1 = "Hello";
System.out.println(str1); // Hello
System.out.println(str1 + "World"); // HelloWorld
String str2 = "Java";
// String + int ---> String
System.out.println(str2 + 20); // Java20
// 优先级问题
// String + int + int
// String + int
// String
System.out.println(str2 + 20 + 30) // Java2030
System.out.println(str2 + (20 + 30)) // Java50
}
}
2.1.4 自增自减运算符
自增运算符:++
自减运算符:–
- 基本含义:让一个数字+1或者-1
- 使用格式:写在变量名称前或者变量名称后均可,如 ++num,也可以num++
- 使用方式:
1.单独使用:不和其他任何操作混合,自己独立成为一个步骤。
2.混合使用:和其它操作混合,例如与赋值混合,或者与打印操作混合,等。 - 使用区别:
1.在单独使用的时候,前++和后++没有任何区别,也就是:++num;和num++;完全一样
2.在混合使用的时候,有重大区别:
如果是前++,那么变量立刻马上+1,然后拿着结果进行使用 先加后用
如果是后++,那么先使用变量本来的数值,然后再让变量+1 先用后加
注意事项:
只有变量才可以用自增、自减运算符,常量不能发生改变,所以不能用。如:++30这样的写法是典型的错误
例子如下:
int num1 = 20
// 混合使用,先++,变量马上变为21,然后打印结果
System.out.println(++num1); // 输出21
int num2 = 20
// 混合使用,后++,首先使用变量本来的30,然后再让变量+1得到31
System.out.println(num2++); // 输出20
int num3 = 30;
// 混合使用,前--,变量立刻变为29,然后赋值给result3
int result3 = --num3
System.out.println(result3); // 29
System.out.println(num3); // 29
int num4 = 30;
// 混合使用,后--,先用原来的变量值赋值给result3,然后再让变量-1变成29
int result3 = --num3
System.out.println(result3); // 30
System.out.println(num3); // 29
int x = 10;
int y = 20;
// 11 + 20 = 31
int result3 = ++x + y--
System.out.println(x); // 11
System.out.println(y); // 19