Java语言基础
1.1 常量
1.1.1 概述
常量可以简单理解为,在程序运行期间,固定不变的量;例如圆周率的值PI = 3.14。
1.1.2 常量的分类
- 字符串常量:凡是用双引号引起来的部分,叫做字符串常量,例如:“abc”、“Hello”;
- 整数常量:只有整数部分的数字,没有小数点,例如:100、0、-250;
- 浮点数常量:含有小数点的数字,例如:2.5、-3.14、0.0;
- 字符常量:凡是用单引号引起来的单个字符,叫做字符常量,例如:‘A’、‘9’、‘中’;
- 布尔常量:只能取值规定的两个值,例如:false、true;
- 空常量:null,代表没有任何数据。
1.2 变量
1.2.1 概述
变量和常量恰恰相反,指在程序运行期间,内容可以发生改变的量。
1.2.2 定义变量的格式
方式一:
数据类型 变量名称; //定义变量
变量名称 = 数据值; //赋值,将右边的数据值,赋值交给左边的变量
public class TestBasic {
public static void main(String[] args) {
int i;//定义了一个整型的变量,但是没有赋值
i = 3;//将3赋值给变量i
}
}
方式二:
数据类型 变量名称 = 数据值;//定义变量的同时进行赋值
public class TestBasic {
public static void main(String[] args) {
int i = 3;//定义了一个整型的变量,将3赋值给变量i
}
}
1.2.3 变量的注意事项
- 没有进行赋值的变量,不能直接使用,一定要先赋值,后使用;
- 如果创建多个变量,那么在相同作用域内变量之间的名称不可以重复,重复会编译报错;
- 对于float和long类型来说,字母后缀F和L最好不要丢掉,而且最好使用大写;
- 如果使用byte或者short类型的变量,那么右侧的数据值不能超过左侧类型的范围;
- 变量使用不能超过作用域的范围,作用域:从定义变量的一行开始,一直到直接所属的大括号结束为止;
- 可以通过一个语句来创建多个变量,用逗号隔开,但一般情况下不推荐这么写,一个分号‘;’代表一个语句的结束;
- 对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,那么javac编译器将会自动隐含的进行强制转换,例如byte num = 30,左侧变量是一个byte类型,但是右侧是一个int类型,但是因为数值没有超过byte的范围,故而系统会自动补上一个byte,如下byte num = (byte)30,因为是int转byte,从大转小,不属于自动转换,而是隐含的强制转换;
- 在给变量赋值的时候,如果右侧的表达式当中全是常量,没有变量,那么编译器javac就会直接将若干个常量表达式计算得到结果,编译之后,.class字节码文件就直接保存了结果,这种称为“编译器的常量优化”,但是一旦有变量参与,就不能进行这种优化了。
1.3 数据类型
1.3.1 数据类型的分类
1.基本数据类型:
分类 | 数据类型 | 所占长度 | 默认值 | 取值范围 |
---|---|---|---|---|
整数型 | byte | 1字节 | 0 | -128(-2^7) ~ 127(2^7 - 1) |
short | 2字节 | 0 | -32768(-2^15) ~ 32767(2^15 - 1) | |
int | 4字节 | 0 | -2147483648(-2^31) ~ 2147483647(2^31 - 1) | |
long | 8字节 | 0 | -9223372036854775808(-2^63) ~ 9223372036854775807(2^63 -1) | |
浮点型 | float | 4字节 | 0.0 | -3.4E38(-3.410^38)~ 3.4E38(3.410^38) |
double | 8字节 | 0.0 | -1.7E308(-1.710^308)~ 1.7E308(1.710^308) | |
字符型 | char | 2字节 | '\u0000' | 0 ~ 65536(2^32) |
布尔型 | boolean | 1字节 | false | false,true |
2.引用数据类型:除基本类型以外的所有类型。
1.3.2 注意事项
- 字符串不是基本类型、而是引用类型;
- 浮点型可能只是一个近似值,并非精确的值;
- 浮点数默认类型是double,如果一定要使用float类型,需要加上一个后缀F;
- 整数默认是int类型,如果一定要使用long类型,需要加上一个后缀L,推荐使用大写字母后缀;
- 数据范围与字节数不一定相关,例如float数据范围比long更加广泛,但是float是4个字节,而long是8个字节。
1.4 数据类型的转换
1.4.1 概述
当数据类型不一样时,但又需要将一个类型的数据转换成另外一个类型,将会发生数据类型的转换。
1.4.2 数据类型的分类
1.自动类型转换(隐式)
特点:代码不需要进行特殊处理,自动完成。
格式:数据范围从小到大,与字节数不一定相关。
public class TestBasic {
public static void main(String[] args) {
int i;
float num = 20;//左边是float类型,右边是int类型,不一致进行自动转换,故而num = 20.0
}
}
2.强制类型转换(显式)
特点:代码需要进行特殊的格式处理,不能自动完成。
格式:范围小的类型 范围小的变量名 = (范围小的类型) 原本范围大的数据。
public class TestBasic {
public static void main(String[] args) {
/**
* int num = 100L;,左边是int类型,右边是long类型,不一致,
* 但是long到int不是从小到大,不能发生自动转换,这是就需要强制转换,
* int num = (int)100L;
*/
// int num = 100L; //会编译报错
int num2 = (int)100L; //正确的强制转换
}
}
1.4.3 ASCLL码
ASCLL码表
American Standard Code for Information Interchange,美国信息交换标准代码,范围0-128,感兴趣的可以自行查略 -》百度百科-验证;不用刻意背,记住几个关键的:‘0’是48、‘A’是65,‘a’是97,小写字母和大写字母之间相差32。
Unicode码表
万国码,也是数字和符号的对照关系,比ASCLL范围更大。
1.4.4 注意事项
- byte、short、char这三种类型在运算的时候,都会被首先提升为int类型,然后在计算,所以当两个byte类型进行计算时,应该用int类型的变量进行接收,但是如果结果在数值范围内没有超过short或者byte,可以进行强制类型转换成byte或者short类型,这样可以节省内存空间也不会造成逻辑错误,但是如果数值范围超过了则会发生数据溢出。
- boolean类型不能发生数据类型转换;
- 强制类型转换一般不推荐使用,因为有可能发生精度损失,数据溢出;
- 如: Long->int 发生数据溢出,float->int 会舍弃所有的小数位,所以会发生精度损失。
1.5 运算符
1.5.1 概述
运算符:进行特定操作的符号,例如:‘+’。
表达式:用运算符连起来的式子叫做表达式,例如‘20+1’。
1.5.2 算数运算符
+(加)、-(减)、*(乘)、/(除)、%(取余)、++(自增)、--(自减)
1.“+”有三种常用的用法
- 对于数值来说,那就是简单的加法运算;
- 对于字符char来说,在计算之前,char会提升成int类型,也就是转换成对应的ASCLL码;
- 对于字符串String来说,加号代表字符串的连接操作,任何数据类型和字符串进行运算,结果都会变成字符串类型。
public class TestBasic {
public static void main(String[] args) {
int a = 1,b = 2;
char c1 = 'a',c2 = 'b';
String str1 = "Hello ",str2 = "Java!";
System.out.println("对于整型:" + (a + b)); //输出:对于整型:3
System.out.println("对于字符型:" + (c1 + c2)); //输出:对于字符型:195
System.out.println("对于字符串型:" + (str1 + str2)); //输出:对于字符串型:Hello Java!
}
}
2.自增自减
- 自增运算符(++):让一个变量的值+1,例如++num或者num++;
- 自减运算符(--):让一个变量的值-1,例如--num或者num--。
public class TestBasic {
public static void main(String[] args) {
int i = 1;
//单独使用
System.out.println(i++);//输出:1,++在后,先使用后加一:此时i=i+1=2
System.out.println(++i);//输出:3,++在前,先加一在使用:此时i=i+1=3
System.out.println(i--);//输出:3,--在后,先使用在减一:此时i=i-1=2
System.out.println(--i);//输出:1,--在前,先减一再使用:此时i=i-1=1
//混合使用
int sum = 0,j = 10;
sum = (j++) + (++j) - (--j) + (j--);//10+12-11+11,Java中的运算是从左往右进行的
System.out.println("sum = " + sum);//输出:sum = 22
}
}
3.注意事项
- 只有变量才可以使用自增自减运算符,常量不可以使用。
1.5.3 赋值运算符
1.赋值运算符的分类
基本赋值运算符:就是一个等号“=”,代表将右侧的数据交给左侧的变量。
复合运算符:“+=”、“-=”、“*=”、“/=”、“%=”。
2.注意事项
- 只有变量才可以使用赋值运算符,常量不能写在赋值运算符的左侧;
- 复合赋值运算符其中隐含一个强制类型转换。
1.5.4 比较运算符
>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、==(相等)、!=(不相等)
1.注意事项
- 比较运算符的结果一定是一个boolean值,成立就是true,不成立就是false;
- 如果进行多次判断,不能连着写,例如“1<x<3”,应该写成“x > 1 && x < 3”。
1.5.5 逻辑运算符
逻辑与 “&&” 和“&”:双目运算符,两边全都是true,才是true,否则为false。
逻辑或“||” 和 “|”:双目运算符,只要有一个true,就全是true,如果全都是false,才是false。
逻辑非“!”:单目运算符,本来是true,变成false,本来是false,变成true。
1.逻辑于和逻辑或的短效果
- 如果根据左边已经可以判断得到的最终结果,那么右边的代码将不再执行,从而节省一定的性能;因此,在工作中,比较推荐使用短路与和短路或。
public class TestBasic {
public static void main(String[] args) {
int i = 1,j = 3;
int a = 5,b = 6;
/**
* 短路与&& 和 逻辑与& 的区别
* &&:当表达式1为假时,整个表达式的结果已经为假了,就不会再执行表达式2
* &:当表达式1为假时,整个表达式的结果已经为假了,仍然会执行表达式2
*/
if(i-- < 0 && j++ < 10);
System.out.println(i);//输出:0,执行了i--操作
System.out.println(j);//输出:3,没有执行j++操作
/**
* 短路或|| 和 逻辑或| 的区别
* ||:当表达式1为真时,整个表达式的结果已经为真了,就不会再执行表达式2
* |:当表达式1为真时,整个表达式的结果已经为真了,仍然会再执行表达式2
*/
if(a++ > 0 || b++ < 10);
System.out.println(a);//输出:6,a++执行了
System.out.println(b);//输出:6,b++没有执行
}
}
2.注意事项
- 逻辑运算符只能用于boolean值;
- 与、或需要左右各自有一个boolean值,但是取反只要有唯一的一个boolean值即可;
- 与、或两种运算符,如果有多个条件,可以连续写。
1.5.6 三元运算符
1.概述
- 一元运算符:只需要一个数据就可以进行操作的运算符;
- 二元运算符:需要两个数据才可以进行操作的运算符;
- 三元运算符:需要三个数据才可以进行操作的运算符。
2.格式
数据类型 变量名称 = 条件判断:表达式A:表达式B
3.流程
首先判断条件是否成立,如果成立为true,那么将表达式A的值赋值给左侧的变量,如果不成立则为false,就将表达式B的值赋值给左侧的变量,二者选其一。
public class TestBasic {
public static void main(String[] args) {
int i = 10;
boolean b = i > 13 ? true : false;//判断:如果i > 13时,b = true,否则,b = false
System.out.println(b);//输出:false
}
}
4.注意事项
- 必须同时保证表达式A和表达式B都符合左侧数据类型的要求;
- 三元运算符的结果必须被使用。
题外话:
如果文章中存在错误的地方,欢迎大家指正出来,共同学习进步,后续会陆续就JAVA这门课程展开进行分享。