1. 变量的变量名、作用域、生存周期
1. 变量名的命名规范
1. 标识符可包含字母、数字、下划线(_)和美元符号($);不能以数字开头。不要用字符$命名标识符,习惯上,$标识符只用在机器自动产生的源代码中。2. 区分大小写。例如:Str和str代表不同的变量;
3. 不可以使用关键字和保留字;(关键字:其实就是某种语言赋予了特殊含义的词。保留字:其实就是还没有赋予特殊含义,留作将来使用的词。)
4. 常量习惯上用大写字母表示;
5. 标识符采取驼峰命名法,每个词的的第一个字母大写(标识符首字母一般不大写;类名大写字母开头,没有限制必须大写或者小写开头,只是一般大家都遵循规范);
6. 标识符一般用全名称,根据字面意义就可以了解标识符的含义(不过真的看个人习惯吧,什么都老长,一个程序下来估计会大不少,有适当的文档说明变量含义就好);
2. 变量的作用域和生命周期
作用域决定了变量的可见性和声明周期,java中的变量可分为全员变量和局部变量。成员变量:在类的所有方法外声明的变量,可被系统初始化(整型默认为0,浮点型默认为0.0;字符串、布尔型、对象默认都是null)。
静态成员变量:用static修饰,在类被加载时被创建。
类成员变量:在类的实例被创建时产生,其生命周期与该类的实例对象的生命周期相同;作用域为整个类,在类中通过属性名直接访问,类.属性名的方式不建议使用。
实例成员变量:只能在类对象实例化后,通过属性的setter、getter方法访问(直接访问会报错)。
局部变量:区别于全员变量,只存在于对应的方法体中;它的作用域在成对的花括号代码块内(不是定义变量的整个方法体);必须显式初始化。
2. 数据类型
1. 八大基本数据类型
数值型:byte(1个字节)、short(2个字节)、int(4个字节)、long(8个字节);浮点型:float(4个字节)、double(8个字节);
字符型:char(2个字节)
布尔型:boolean(true和false)
数据类型 | 数据类型 | 范围 | 占用存储空间 |
数值型 | byte | -27(-128)~ 27-1(127) | 8位 |
数值型 | short | -215(-32 768)~215-1(32 767) | 16位 |
数值型 | int | -231(-2 147 483 648)~231-1(2 147 483 647) | 32位 |
数值型 | long | -2-63~263-1 | 64位 |
数值型 | float | 负数范围:-3.4028235E+38~-1.4E-45 | 32位,标准IEEE754 |
数值型 | double | 负数范围:-1.7976931348623157E+308 ~-4.9000000E-324 正数范围:4.9E-324~ 1.7976931348623157E+308 | 64位,标准IEEE754 |
布尔值类型 | boolean | true或者false |
|
字符类型 | char | 用UTF-16编码描述一个代码单元 | 16位 |
1.整型默认int类型,long类型后须加上L,当值未超过int的表示范围不加也不报错,超过int的范围不加就报错(建议加上);浮点型默认double,浮点数默认double,可以为double带上D,float的不加F就会报错;
2.byte、char、short相互计算时,自动转int,数据不会失真。int、long计算超过数值范围数据会失真。float和double的值用指数表示后计算结果一般也会出现偏差;
如:byte b = 127;
byte b1 = 2;
System.out.println(b + b1);//129(byte只能表示-128~127,两个byte之和按理说是-127,但byte、char、short会自动转为int,结果并未超过int的表示范围,为129)
int i = 2147483647;
int i1 = 2;
System.out.println(i + i1);//-2147483647(int表示范围-2147483648~2147483647,数据超过数值范围后失真)
另外java.math包中有BigInteger和BigDecimal,这两个类可以包含任意长度数字序列的数值;
BigInteger类实现了任意精度的整数运算,BigDecimal类实现了任意精度的浮点数运算。
2. 自动类型转换
byte→short(char)→int→long→float→double;(从左到右级别由低到高,数值自动转换为更高级别数据类型)强制类型转换:将某数据类型转换为其他类型;
如:long l = 2147483649L;
int i1 = (int)l;
System.out.println(i1);//-2147483647
3. 强制转换
byte i = (byte) 100; 强制类型的值如果超过转换后值的数值范围就会出现数据位溢出,数据失真。
4. Java自动装箱、拆箱
基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。
一般我们要创建一个类的对象实例的时候,我们会这样:
Class a = new Class(parameter);
当我们创建一个Integer对象时,下面两种方式等价;编译器调用编译器调用的是static Integer valueOf(int i):
Integer i = 100;//注意:不是 int i = 100;
Integer i =new Integer(100);
基本数据类型不是对象,无法调用方法。
自动拆箱(unboxing),也就是将对象中的基本数据从对象中自动取出。
Integer i = 10; //装箱
int t = new Integer(i); //拆箱,实际上执行了 int t = i.intValue();
八大基本数据类型对应的装箱类型:
Primitive type | Wrapper class |
---|---|
boolean | Boolean |
byte | Byte |
char | Character |
float | Float |
int | Integer |
long | Long |
short | Short |
double | Double |
尽管Java编译器能够帮组我们自动进行相应基本数据与引用类型的相互转化,但是不太建议编程中大量使 用,因为存在二次转化,考虑性能。
3. 运算符
1. 算数运算符
加(+)、减(-)、乘(*)、除(/)、求模(%)(PS:求模就是求余数)、++(自加)、--(自减)
除数为0,则java文件无法编译;
整数间的操作得到的结果始终是整数(不能整除的结果仍为整数);
含浮点数的操作始终会得到浮点数(不能整除的结果就会含小数位);
+ 还可以作为字符串连接符;
2. 关系运算符
大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!=)
3. 逻辑运算符
逻辑运算符有:&& || !^ & |
&&和&(与):有false,结果为false;
||和|(或):有true,结果为true;
&和|运算是把逻辑表达式全部计算完,而&&和||运算具有短路计算功能。
对于&来说,如果左侧条件为false,也会计算右侧条件的值,而对于&&来说,如果左侧的条件为false,则不计算右侧的条件,这种现象被称作短路现象。
!(非):true返回false,false返回true;
^(异或):相同为false,相异为true;
4. 位运算符
按位与'&',按位或'|',按位非'~',按位异或'^',右移'>>',左移'<<',0填充的右移'>>>'
按位与:有0与0;按位或:有1或1;按位非:0结果为1,1结果为0;按位异或:相同为0,相异为1;
5. 赋值运算符和其他运算符
赋值运算符:赋值(=)、加等于(+=)、减等于(-=)、乘等于(*=)、除等于(/=)、求模等于(%=);如:a+=2;同a = a + 2; a *= 3同a = a *3;
同时+=也可以用于字符串的拼接;
6. 运算符优先级
优先级自上而下,级别由高到低。
三目运算符:可替代简单的条件运算符,但其结合性从右往左使其不能应用于复杂的条件运算;
例子:判断各级对象是否为空,最后为了获取用户的部门名称(中间应该判断user.getDeptId()是否为空,这里省略)
String deptName =(user==null?"":user.getDeptId().getDeptName()==null?"":user.getDeptId().getDeptName());(刚好前几天看到一个同事的例子就是这个类似的获取值;因为他不清楚三目运算符的结合方向所以报错;我用三目运算符不知道怎么去实现这个效果了,哈哈);
4. 流程控制语句
1. 顺序流程控制语句
2.选择流程控制语句
if分支语句
if(条件){
...
}
if(条件){
...
}else{
...
}
if(条件1){
...
}else if(条件2){
...
}else{
...
}
switch分支语句
switch(表达式){
case 值1 :语句1;
case 值12 :语句2;
……
[default:语句n;]
}
在
Java7
之前,
switch
只能支持
byte
、
short
、
char
、
int
或者其对应的封装类以及
Enum
类型。
Java7
加上了
String
;
3. 循环流程控制语句
//while语句
while(循环条件){
...
}
//do-while语句
do{
...
}while(循环条件);
//for语句
for(初始化表达式;检测表达式;更新表达式){
...
}
//foreach语句;不用与for一样,根据index一个个获取对象的值;好处在于可不用管数据集合的长度;for则必须明确数据集合的长度;
for(元素类型t 元素变量x : 遍历对象obj){
引用了x的java语句;
}
do-while先执行,再判断条件是否为真,为真则继续执行。所以至少可以执行一次
break:终止分支语句;
continue:结束本次循环,进入下一轮循环;
return:结束函数体;