一 注释
1.单行注释:以双斜线(//)开头,仅在该行有效。这种注释用于解释代码的一行或代码块的一部分,帮助读者快速理解代码的意图。
2.多行注释:以/*开头,以*/结尾,可以跨越多行。多行注释提供了更大的灵活性,用于解释一段代码、一个方法或一个类的功能和行为。
3.文档注释:以/**开头,以*/结尾,主要用于生成API文档。文档注释可以跨越多行,并且可以使用特殊的标记来生成API文档,如@param、@return等,这些标记用于提供关于类、方法、属性等的详细描述和说明。
二 类型转换
2.1 八种数据基本类型转换的时候需要遵循哪些规则?
第一条:八种基本数据类型中,除 boolean 类型不能转换,剩下七种类型直接都可以进行转换;
第二条;如果整数型字面量没有超出 byte, short, char 的取值范围,可以直接将其赋值给 byte, short, char 类型
的变量;
第三条:小容量想大容量转换称为自动类型转换,容量从小到大的排序为:
byte < short(char) < int < long < float < double,
(发生强制类型转换把大的值赋值给等号前面小的值时看当前赋给谁的值类型是什么强转括号填该类型)例如
1 下图 String的父类Object在进行强转如()中的提示
例如 2 :
要确保转换byte类型时不能超过取值范围(如果超出输出的值会出错)
其中 short 和 char 都占用两个字节,但是 char 可以表示更大的正整数;
第四条:大容量转换成小容量,称为强制类型转换,编写时必须添加“强制类型转换
符”,
但运行时可能出现精度损失,谨慎使用;
第五条:byte, short, char 类型混合运算时,先各自转换成 int 类型再做运算;
第六条:多种数据类型混合运算,各自先转换成容量最大的那一种再做运算。
多种数据类型做混合运算的时候,最终的结果类型是“最大容量”的对应的类型。
char, short, byte 这个除外。
因为 char + short + byte 混合运算的时候,会各自先转换成 int 再做运算
2.2 String类型和基本数据类型的转换
String类型转换为基本数据类型使用包装类Interger
基本数据类型转换为String类型用Valueof()
三 变量
变量的声明与赋值
说明:变量表示存储单元,变量名就是存储单元的名称,变量初始化之后就可以通过变量名访问存储单元。
1、变量声明 int i; String str; //还没有分配存储空间
2、初始化(赋初值) i=10; str=”abc”; //初始化之后就分配了存储空间
3、声明并赋值 int i = 10; String str=”abc”; //声明的同时进行初始化
注意:变量在使用之前必须先初始化(赋初值)。
四 常量
常量的声明与赋值
声明常量需要使用final关键字,如,final double PI = 3.1415926。
常量通常在声明时赋值,并且赋值之后其值不能改变
常量标识符通常全部为大写。
五 实例变量与局部变量
根据变量声明的位置,变量可以分为实例变量和局部变量。
5.1 实例变量及作用范围
在类的{}内直接定义的变量,称为全局变量。
作用范围:整个类中都可以使用
实例变量在创建对象时会自动初始化,并有初始值(默认值)
byte/short/int:0
long:0L
float:0.0f
double:0.0
boolean:false
引用类型:null
(全局变量上不给默认值的话静态变量在静态方法中可以输出在实列方法中也可以输出)
而在全局变量定义在静态方法中不可以在实例中方法中可以)
5.2 局部变量及作用范围
在方法中或代码块{}中定义的变量,称之为局部变量。
作用范围:直接包含它的{}内有效
局部变量不会自动初始化,没有默认值,使用之前必须要初始化。
5.3 全局变量与实例变量的区别
实例变量
实例变量(又称成员变量):必须依附于对象存在,
只有实例化类后才可以使用此类中的实例变量
(即new 对象后才能调用)如代码中的
局部变量
方法体内定义的局部变量 (定义的实列变量)
方法体内定义的局部变量仅能在该方法中使用,若外部直接使用,则会报错
三、全局变量和局部变量的区别如下:
1,作用域不同:全局变量的作用域为整个程序,而局部变量的作用域为当前函数或循环等
2,内存存储方式不同:全局变量存储在全局数据区中,局部变量存储在栈区
3,生命周期不同:全局变量的生命期和主程序一样,随程序的销毁而销毁,局部变量
在函数内部或循环内部,随函数的退出或循环退出就不存在了
4,使用方式不同:全局变量在声明后程序的各个部分都可以用到,但是局部变量只
能在局部使用。函数内部会优先使用局部变量再使用全局变量。
5,工具类里的方法都使用静态的。(静态方法有一个优点,是不需要new对象,直接
采用类名
调用,极其方便。工具类就是为了方便,所以工具类中的方法一般都是static的。)
6,什么时候变量声明为实例的,什么时候声明为静态的?
如果这个类型的所有对象的某个属性值都是一样的,不建议定义为实例变量,浪费内
存空间。
建议定义为类级别特征,定义为静态变量,在方法区中只保留一份,节省内存开销。
一个对象一份的是实例变量。
所有对象一份的是静态变量。
六 运算符
6.1 运算符
可以将大部分Java运算符划分为四组:算术运算符、位运算符、关系运算符以及逻辑运算符。
6.2 赋值运算符
赋值运算符有一个有趣的特性:它允许创建赋值链。例如,分析下面的代码段:
int x, y, z;
x = y = z = 100; // set x, y, and z to 100
6.3 算术运算符
算术运算符用于数学表达式,其使用方法与在代数中的使用方法相同。
运算符 | 结 果 |
+ | 加法(也是一元加号) |
- | 减法(也是一元负号) |
* | 乘法 |
/ | 除法 |
% | 求模/取余 |
+= | 加并赋值 |
-= | 减并赋值 |
*= | 乘并赋值 |
/= | 除并赋值 |
%= | 求模并赋值 |
++ | 自增 |
-- | 自减 |
需要注意的地方:
(1)当将除法运算符用于整数类型时,其结果不会包含小数部分。
(2)求模运算符%,返回除法操作的余数。它既可以用于浮点数也可以用于整数。可以用于判断一个整数是否是奇数、偶数、是否是某个数的倍数。
6.4 算术与赋值复合运算符
int a = 1;
a += 2; //相当于a = a+2;
(1)对于所有的二元算术运算,都有相应的复合赋值运算符。
(2)复合赋值运算符的效率更高。所以在专业的Java程序中,会经常看到复合赋值运算符。
自增与自减
(1)自增运算符将其操作数加1。自减运算符将其操作数减1。
(2)自增与自减分前缀形式与后缀形式。++、--
前缀形式:
int i = 10;
int a = ++ i; //等同于 i++; int a = i; 所以a=11, i= 11
后缀形式:
int j = 10;
int b = j++; //等同于 int b = j; j++; 所以b=10,j = 11
表达式
(1)表达式的概念:由操作数与运算符组成 j++; a+b;
(2)表达式的求值:表达式是有值的,需要注意表达式值的类型
(3)表达式中的类型提升规则:
表达式的类型会自动提升为所有操作数的最大类型。
对于操作数全为非long类型整数的表达式,其类型会自动提升为int。
6.5 关系运算符
关系运算符也称为比较运算符
运算符 | 结 果 |
== | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
(1)关系运算的结果为boolean型数值。
(2)关系运算符最常用于if语句和各种循环语句中的控制表达式。
6.5 逻辑运算符
布尔逻辑运算符,只能操作boolean型操作数。
运算符 | 结 果 |
&& | 逻辑与(短路形式) |
|| | 逻辑或(短路形式) |
^ | 逻辑异或 |
! | 逻辑一元非 |
& | 逻辑与 |
| | 逻辑或 |
布尔逻辑运算规则:
操作数 | 逻辑运算及结果 | ||||
A | B | A || B | A && B | !A | A ^ B |
false | false | false | false | true | false |
true | false | true | false | false | true |
false | true | true | false | true | true |
true | true | true | true | false | false |
运算规则说明:
对于||,只要有一个操作数为true,则结果为true;
对于&&,只要有一个操作数为false,则结果为false。
对于^,两个操作数不同,则结果为true,否则结果为false。
注意:&&和||,
这两个运算符是所谓短路形式的逻辑运算符。假如单独根据左操作数就能确定表达式的结果,那么就不会计算右操作数的值。
演示逻辑运算符的运算符规则
演示短路逻辑表达式的求值过程
int a = 5;
int b = 6;
if(a < b || ++a == b)
//通过第一部分就能确定最终结果的话,第二部分就不会执行
{
System.out.println(a);
} //分别使用 | 和 || 测试效果(输出a的值)
6.6 三目运算符(三元)
运算规则
表达式1 ? 表达式2: 表达式3
语法:表达式1?表达式2:表达式3
表达式1必须是boolean类型的表达式
如果结果为true,那么取表达式2的结果
如果结果为false,那么取表达式3的结果
int aa = 24;
int bb = 23;
int r = aa>bb?3:4;
System.out.println("r = "+r);
大概顺序:算术运算符>移位运算符>关系运算符>逻辑运算符>赋值运算符
圆括号会提升其内部操作数的优先级。为了得到所期望的结果,这通常是必需的。圆括号(不管是否冗余)不会降低程序的性能。所以,为了减少模糊性而添加圆括号,不会对程序造成负面影响。