2.1 注释
-
单行注释://
-
多行注释:/* */
-
文档注释:/** */
javadoc -encoding UTF-8 -charset UTF-8
2.2 变量
-
成员变量: 属于类
-
局部变量:属于方法体内的
-
实例变量:属于对象
-
类变量:跟着类走; static 修饰符(静态)
成员变量和局部变量的区别:
- 成员变量属于类, 局部变量属于方法; 成员变量可被public, private, static 修饰, 局部变量不可被 static 修饰, 两者都可被 final 修饰
- 成员变量的作用域大于局部变量
- 成员变量在内存的生存时间是由对象的创建而生, 局部变量则是由方法的调用和结束
- 成员变量如果是非static修饰的话, 则由对象的实例化而存在与堆内存中,如果是static 修饰则随着类加载而加载,存在于方法区; 局部变量存在于 栈内存
- 成员变量如果没有被赋值,则会由类型的默认值赋值,局部变量不会.
2.2.1 常量
- 常量是一种特殊的变量,常量初始化之后的值无法修改
- final 关键字 修饰 常量;常量名大写字母
- final 变量类型 常量名 = 常量值;
- 修饰符 不存在先后顺序
2.2.2 变量的命名规范
-
类成员变量:首字母小写和驼峰原则
-
局部变量:首字母小写和驼峰原则
-
常量:大写字母和下划线
-
类名:首字母大写和驼峰原则
-
方法名:首字母小写和驼峰原则
字符串常量和字符常量的区别:
- 字符常量是单引号引起的一个字符;字符串常量是双引号引起的多个字符
- 字符常量相当于一个整型值;而字符串常量是内存中的地址
2.3 标识符
- Java 所有的组成部分都需要名字。类名,方法名,变量名都称为 标识符
- 关键字:被赋予特殊含义的标识符
2.3.1 关键字
abstract | assert | boolean | break | byte |
---|---|---|---|---|
case | catch | char | class | const |
continue | default | do | double | else |
enum | extends | final | finally | float |
for | goto | if | implements | import |
instanceof | int | interface | long | native |
new | package | private | protected | public |
return | strictfp | short | static | super |
switch | synchronized | this | throw | throws |
transient | try | void | volatile | while |
final 关键字
final 可以用来修饰类、方法、变量
- 修饰的变量如果是基本数据类型,初始化之后值将无法改变;如果是引用数据类型,则初始化过后对应的引用地址不可改变
- 修饰方法,此方法不可被重写
- 将方法锁定,以防任何继承类修改它的含义
- 效率
- 修饰类,表明这个类无法被继承,且类中的成员方法都隐式的声明为final方法。
static 关键字
https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/basic/final,static,this,super.md
staitic 可以用来修饰方法、变量、代码块、内部类
- 修饰成员变量和方法:static 修饰的变量和方法静态成员变量、方法;可以使用类名.变量来调用;只属于类本身,不属于任何对象;存储位置位于方法区中;
- static修饰代码块;静态代码块;定义在类的方法外;先于非静态代码块被执行;且执行初始化一次;
- 静态内部类:(static修饰类的话只能修饰内部类);静态内部类和非静态内部类的最大区别在于非静态内部类初始化后,有一个隐士的指向外围的类,静态内部类则没有;静态内部类无法使用外围类的非静态成员变量和方法
- 静态导包:
this 关键字
this 用于引用类的当前实例
super 关键字
super 用于子类访问父类的变量和方法
总结:
1.this 和 super 不能用在 static 方法中
- static 方法表示静态方法,它只属于类,不属于某个对象;this 表示实例对象,super 表示子类对象的父类的实例对象;static 属于类;this 和 super 属于对象
2.在构造器中使用 super() 调用父类中的其他构造方法时,必须位于首行;this 调用本类的其他构造时,也需位于首行
2.4 基本运算符
- 算术运算符:+、-、*、/、%、++、--
- 赋值运算符:=
- 关系运算符:>、<、>=、<=、!=、instanceof
- 逻辑运算符:&& 、||、 !
- 位运算符:>> <<
- 条件运算符:?:
- 扩展赋值运算符:
自增自减运算符: ++ 、 --
- 当自增自减运算符位于数字前面:则数字先完成 自增/减 后,在赋值;位于数字后面:则先赋值,在运算自增/减。
2.6 流程控制
2.6.1 顺序结构
- Java语言的 基本结构,由上而下一步步执行
- 它是任何一种算法都离不开的基本算法结构
2.6.2 选择结构
-
if 单选择结构
if(){}
-
if 双选择结构
if(){} else{}
-
if 多选择结构
if(){} else if() {} ... else{}
-
if 嵌套结构
if() { if(){} ...}
-
switch 选择结构
String str = "A"; switch (str){ case "A": System.out.println("A"); break; case "B": System.out.println("B"); break; default: System.out.println("未知"); }
case 穿透现象,需 break; 匹配一个具体的值
2.6.3 循环结构
-
while 循环
while (布尔表达式){ // 输出 } // 样例 int i=0; while (i<100){ i++; System.out.println(i); } // 注意:需将程序停一下,已避免死循环
-
do ... while ... 循环
do{ }while(布尔表达式);
- 注意:while 先判断条件后执行,do while 先执行后判断(循环体至少被执行一次)
-
for 循环
for(初始化值; 布尔表达式; 更新){ // code } ================================================================================================ // 注:增强for循环 for(声明语句:表达式){ }
continue、break、return 的区别:
- break 用于强行退出循环,不执行剩余语句;跳出循环体,剩余程序不会终止
- continue 用于终止当次循环过程,跳过未执行的语句,接着进行下一次循环
- return 结束方法运行
2.7 泛型
Java 泛型是 JDK5 中引入了一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是所操作的数据类型被指定为一个参数。
Java 泛型是伪泛型,这是因为 Java 在编译期间,所有的泛型信息都会被擦掉,这是通常所说的类型擦除。
泛型的三种方式:泛型类、泛型接口、泛型方法。
泛型类
-
Generic<T> : 常见的 T、E、K、V 等形式的参数常用于表示泛型
-
实例化泛型的时,必须指定具体的类型
Generic<Integer> num = new Generic<Integer> ();
泛型接口
泛型方法
常用的通配符:T E K V ?
- ? 表示不确定的 java 类型
- T (type) 表示具体的一个java类型
- K V (key value) 分别代表java键值中的Key Value
- E (element) 代表Element
2.8 == 和 equals 的区别
- == 判断两个对象的地址是不是相等,即判断是否为同一对象
- 基本数据类型:== 比较的是值
- 引用数据类型:== 比较的是内存地址
因为Java 只有 值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型,其本质都是比较值,只是引用类型变量存的值是对象的地址
-
equals:判断两个对象是否相等,但不能作为基本数据类型的比较
-
equals 是 Object 类的方法
public boolean equals(Object obj) { return (this == obj); }
-
equals 的两种使用情况
- 不重写 Object 的 equals
- 重写 Object 的 equals
-
String 方法重写了 equals 方法
- Object 的 equals 比较的对象的内存地址
- String 的 equals 比较的是对象的值
-
2.9 hashCode 和 equals
2.9.1 概念
hashCode 的作用是获取哈希码,也就是散列码,本质为 int 整数。他的作用是确定该对象在哈希表中的索引位置。
Object 的hashCode 方法,意味着所有的Java方法都有此方法。hashCode 方法是一个本地方法,也就是通过 C或者 C++ 实现的,该方法通常用来将对象的内存地址转换为整数后返回。
public native int hashCode();
散列表存储是键值对(key-value),它的特点是可以根据key 快速找到对应的 value. 其中就利用了 散列码。
2.9.2 为什么要有 hashCode?
以 HashSet 如何检索重复 为例:
HashSet 存储对象的时候,会先计算对象的 hashCode 值,将 hashCode 去已加入对象hashCode中进行检索和比较,当找不对相等的hashCode时,则加入散列到其他位置;但是如果匹配到了就会使用 equals 方法来检查 hashCode 相等的对象是否真的相等。
以此大大减少了 equals 的次数,提升了效率。
2.9.4 为什么重写 equals 时必须重写 hashCode 方法?
两个相等的对象,他们的 hashCode 也必然是相等的。两者分别执行equals ,皆为 true.
但是就算hashCode相等的对象,也不一定是相等。
2.9.5 为什么相同的hashCode的对象,也不一定相等?
因为hashCode所使用的杂凑算法业务刚好会让多个对象拥有相同的杂凑值。