标识符
定义:类名、变量名以及方法名都被称为标识符。
规则:所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始,
首字符之后可以是字母(A-Z或者a-z),美元符($)、下划线(_)或数字的任何字符组合
注释
单行注释:// 注释内容
单行注释:/*... 注释内容....*/
文本注释:/**.. 注释内容....*/
文档注释位置
(1)类注释。类注释用于说明整个类的功能、特性等,它应该放在所有的“import”语句之后,在class定义之前。
这个规则也适用于接口(interface)注释。
(2)方法注释。方法注释用来说明方法的定义,比如,方法的参数、返回值及说明方法的作用等。方法注释应该放在它所描述的方法定义前面。
(3)属性注释。默认情况下,javadoc只对公有(public)属性和受保护属性(protected)产生文档——通常是静态常量。
(4)包注释。类、方法、属性的注释都直接放到Java的源文件中,而对于包的注释,无法放到Java文件中去,只能通过在包对应的目录中添加一个package.html的文件来达到这个目的。当生成HTML文件时,package.html文件的<BODY>和</BODY>部分的内容将会被提取出来当做包的说明。关于包注释,后面还会有更进一步的解释。
(5)概要注释。除了包注释外,还有一种类型的文档无法从Java源文件中提取,就是对所有类文件提供概要说明的文件。同样的,也可以为这类注释单独新建一个HTML文件,这个文件的名字为“overview.html”,它的<BODY>和</BODY>标记之间的内容都会被提取。
- @author:作者。
- @version:版本。
- @docroot:表示产生文档的根路径。
- @deprecated:不推荐使用的方法。
- @param:方法的参数类型。
- @return:方法的返回类型。
- @see:用于指定参考的内容。
- @exception:抛出的异常。
- @throws:抛出的异常,和exception同义
数据类型
Java的八种基本类型:(按字节来分)
- boolean 布尔型 1个字节 8bit(8位)
- byte 字节类型 1个字节
- char 字符类型 2个字节
- short 短整型 2个字节
- int 整型 4个字节
- float 浮点型(单精度)4个字节
- long 长整型 8个字节
- double 双精度类型 8个字节
Java中默认的整数类型是int,如果要定义为long ,则要在数值后加上L或者l
默认的浮点型是双精度浮点,如果要定义float,则要在数值后面加上f或者F
float数据类型及double数据类型
1 范围
float和double的范围是由指数的位数来决定的。
float的指数位有8位,而double的指数位有11位,分布如下:
float:
1bit(符号位) | 8bits(指数位) | 23bits(尾数位) |
double:
1bit(符号位) | 11bits(指数位) | 52bits(尾数位) |
于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024。
float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。
2 精度
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
变量
通过三个元素来描述变量:变量类型,变量名以及变量值。
类变量:
- 在类中以static关键字声明。
- 静态变量可以通过:ClassName.VariableName的方式访问。
成员变量:
- 成员变量在对象创建的时候创建,在对象被销毁的时候销毁;
- 引用类型的成员变量的默认值是null
局部变量
- 在方法中定义
- 不能使用访问修饰符修饰
- 局部变量是在栈上分配的
- 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。
常量
使用final修饰的变量,它的值被设定后,在程序运行过程中不允许被改变。
常量名一般使用大写字符。
运算符
算术运算符
操作符 | 描述 | 例子 |
---|---|---|
+ | 加法 - 相加运算符两侧的值 | A + B 等于 30 |
- | 减法 - 左操作数减去右操作数 | A – B 等于 -10 |
* | 乘法 - 相乘操作符两侧的值 | A * B等于200 |
/ | 除法 - 左操作数除以右操作数 | B / A等于2 |
% | 取余 - 左操作数除以右操作数的余数 | B%A等于0 |
++ | 自增: 操作数的值增加1 | B++ 或 ++B 等于 21(区别详见下文) |
-- | 自减: 操作数的值减少1 | B-- 或 --B 等于 19(区别详见下文) |
关系运算符
运算符 | 描述 | 例子 |
---|---|---|
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (A == B)为假(非真)。 |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (A> B)非真。 |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (A <B)为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (A> = B)为假。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (A <= B)为真。 |
位运算符
操作符 | 描述 | 例子 |
---|---|---|
& | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
| | 如果相对应位都是0,则结果为0,否则为1 | (A | B)得到61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
逻辑运算符
操作符 | 描述 | 例子 |
---|---|---|
&& | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 | (A && B)为假。 |
| | | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 | (A | | B)为真。 |
! | 称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | !(A && B)为真。 |
赋值运算符
操作符 | 描述 | 例子 |
---|---|---|
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C |
+ = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A |
- = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C - A |
* = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A |
/ = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A等价于C = C / A |
(%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A |
<< = | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
>> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
&= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
^ = | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 |
| = | 按位或赋值操作符 | C | = 2等价于C = C | 2 |
其他运算符:条件运算符(?:),instanceof 运算符
运算符优先级
类别 | 操作符 | 关联性 |
---|---|---|
后缀 | () [] . (点操作符) | 左到右 |
一元 | + + -- !〜 | 从右到左 |
乘性 | * /% | 左到右 |
加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
关系 | >> = << = | 左到右 |
相等 | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | | | | 左到右 |
条件 | ?: | 从右到左 |
赋值 | = + = - = * = / =%= >> = << =&= ^ = | = | 从右到左 |
逗号 | , | 左到右 |
数值类型转换
自动类型的提升
强制类型转换
循环结构
- while 循环
- do…while 循环
do {
//代码语句
}while(布尔表达式);
- for 循环
for(初始化; 布尔表达式; 更新) {
//代码语句
}
for(声明语句 : 表达式)
{
//代码句子
}
分支结构
- if 语句
- switch 语句
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}
访问控制修饰符
访问控制修饰符 :public,protected,default, private
类内部 | 包内 | 子类 | 外部包 | |
---|---|---|---|---|
public | Y | Y | Y | Y |
protect | Y | Y | Y | |
default | Y | Y | ||
private | Y |
关键字
final:
- 1.修饰类:当用final修饰一个类时,这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法,成员变量可以根据需要设为final
- 2.修饰方法:final方法不能被覆写。
- 3.修饰变量:对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
- 4.修饰方法的参数:防止修改这个参数的值,同时也是一种声明和约定,强调这个参数是不可变的。局部变量以及参数中的final,并不能提升我们的性能,它甚至不会被写进字节码中
this:
- this关键字可以在方法内使用,用来表示“调用方法的那个对象”的引用。因为编译器会将当前对象的引用作为第一个参数传入调用的方法。这个引用可以用this关键字表示,
- this语句,可以在构造器中调用其它构造器
super:
- 用来表示父类对象的引用
- super语句,在构造器中调用父类构造器
static:
1)修饰方法
用static修饰的方法可以通过类名直接引用,无需创建任何对象。这是static方法的主要用途。在static方法内部不能调用非静态方法,反过来是可以的
2)修饰成员变量
使用static关键字修饰的成员变量,会在类加载的时候在內存中分配空间,被所有的对象所共享,在内存中只有一个副本。
类变量现在存储在java堆 JDk8
3)static代码块
在类被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
4)修饰成员内部类
不用static修饰,成员内部类无法定义静态成员或静态方法
创建静态内部类时不依赖外部类实例
transient
被transient修饰的变量不会被序列化
序列化:把对象转换为字节序列的过程。
反序列化:把字节序列恢复为对象的过程。
什么情况下需要序列化 :
当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
当你想用套接字在网络上传送对象的时候;
当你想通过RMI传输对象的时候;
静态的属性能不能被序列化和反序列化
实现Serializable 接口的时候,一定要给 serialVersionUID 赋值
volatile
break:结束循环
continue:立刻跳到下一次循环
instanceof:用来判断对象是否是某各类的一个实例
assert:
finalize:finalize()会在对象内存回收前被调用一次
枚举(enum)
用法一:常量
public enum Color {
RED, GREEN, BLANK, YELLOW
}
用法二:switch
enum Signal {
GREEN, YELLOW, RED
}
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
用法三:向枚举中添加新方法
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
// 普通方法
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
// get set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
用法四:使用接口组织枚举
public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT, CAKE, GELATO
}
用法五:关于枚举集合的使用
java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。