一: 语法细节
1. Java 中的命名规则:
package: 统一使用小写字母
class: 首字母大写, 使用驼峰标识
method: 首字母小写, 使用驼峰标识
field: 首字母小写, 使用驼峰标识
static field: 统一使用大写字母, 并用下划线分割单词
2. import 和 import static
import com.xxx: 常规导入某个包下的类
import static com.xxx: 会导入某个包下的类的所有静态方法, 这样之后再使用该类的静态方法时, 可以直接使用方法名调用, 而不必使用 类名. 方法名 来调用静态方法
示例:
3. println 和 print
System.out.println: 在下次打印时自动换行
System.out.print: 在下次打印时不自动换行
4. Java 访问权限修饰符
每个编译单元 (即一个. java 文件) 都只能有一个 public 类, 表示每一个编译单元都有一个单一的公共接口, 用 public 类来展现.
5. final 关键字
final 修饰的基本数据类型一旦初始化则数值恒定不变
final 修饰的对象引用表示: 该引用一旦被初始化指向某个对象, 就无法再将它改变为指向另一个对象(注意引用指向的对象自身是可以改变的)
final 修饰的类不允许被任何子类继承
final 修饰的方法将会被锁定, 任何子类都无法修改它
声明为 final 的域可以在一开始不给定初值, 但是编译器会确保该域在使用前必须初始化
由 static final 修饰的域将会占据一段不能改变的存储空间
二: 基本数据类型
基本类型 | 大小 | 初始值 | 包装类 | 最小值 | 最大值 |
boolean | - | false | Boolean | - | - |
char | 16-bit | '\u0000' | Character | ‘\u0000’ (0) | ‘\uffff’ (65535) |
byte | 8-bit | 0 | Byte | -128 | 127 |
short | 16-bit | 0 | Short | - 2^15 (负的 2 的 15 次方) | 2^15 - 1 |
int | 32-bit | 0 | Integer | - 2^31 | 2^31 - 1 |
float | 32-bit | 0.0f | Float | IEEE754 | IEEE754 |
double | 64-bit | 0.0d | Double | IEEE754 | IEEE754 |
long | 64-bit | 0L | Long | - 2^63 | 2^63 - 1 |
1. 创建基本数据类型不需要 new 操作符.
2. 当基本类型变量作为类的成员变量使用时, 才会在初始化时被赋予初值; 作为方法体中的局部变量时, 则必须要被初始化才能使用.
3. 对象引用的默认初始值为 null.
4. float / double 转换为整型时, 总是对该数字执行截尾操作(四舍五入效果实现需要使用 java.lang.Math.round() 方法).
5. 用于高精度计算的类:
- BigInteger(支持任意大小的整数值)
- BigDecimal(支持任意精度的定点数)
- (定点数: 指参与运算的数的小数点位置固定不变)
能作用于 int / float 的操作同样也能作用于 BigInteger / BigDecimal, 只是 BigInteger / BigDecimal 需以方法调用的方式使用, 而不是以运算符的形式来使用.
6. 基本类型之间比较是否相同可以直接使用 "==";
对象之间比较是否相同需要使用 equals() 方法; 对象之间如果使用 "==" 操作符比较, 实际比较的是两个对象的引用地址.
7. 算术运算中, 表达式中出现的最大数据类型决定了表达式最终结果的数据类型(比如: 一个 float 值与一个 double 值相乘, 结果值是 double 类型);
char / byte/ short 中任意一个或一个以上进行算术运算(如'a'+'b' ), 都会获得一个 int 型的结果;
从较大范围的类型向较小范围的类型转换时, 可能引发某些信息的丢失.
三: Java 中对象的四种引用类型
1. StrongReference -- 强引用
强引用是最普遍的引用, 垃圾回收器不会回收强引用的对象; 当内存空间不足时, JVM 宁愿抛出 OutOfMemoryError 也不会回收强引用对象以释放部分内存空间;
强引用对象 o 不使用时可以通过如下方式弱化引用:
(现在的 JVM 垃圾回收机制其实已经足够智能, 不必特意在 o 无用时将其手动置为 null)
2. SoftReference -- 软引用
如果一个对象只具有软引用, 则:
当内存空间足够时, 垃圾回收器不会回收该对象;
当内存空间不足时, 垃圾回收器就会回收该对象;
使用场景: 软引用可以用来实现内存敏感的高速缓存:
例如: 浏览器中的后退按钮按下时, 之前的网页内容是应该重新获取还是从缓存中取出呢?
如果一个网页在浏览结束时就进行内容的回收, 则每次按后退按钮时都要重新构建之前的页面内容; 如果将浏览过的网页都存储在内存 (缓存) 中, 会造成大量的资源浪费; 这时候就可以考虑使用软引用来指向过去浏览过的网页内容.
3. WeakReference -- 弱引用
弱引用与软引用区别: 只具有弱引用的对象拥有更短的生命周期; 当垃圾回收器扫描到只具有弱引用的对象时, 无论当前内存空间是否足够, 都会回收它;
使用场景: 一个对象只是偶尔使用, 希望在使用时能随时获取, 但也不想影响对该对象的垃圾收集, 则可以考虑使用弱引用来指向该对象.
4. PhantomReference -- 虚引用
虚引用不会决定对象的生命周期, 如果一个对象仅仅持有虚引用, 那它就像没有任何引用一样, 随时可能被垃圾收集器回收;
虚引用必须和引用队列联合使用, 主要用来跟踪对象被垃圾收集器回收的活动过程.
5. 对比
StrongReference(强引用) > SoftReference(软引用) > WeakReference(弱引用) > PhantomReference(虚引用)
四: 关于方法的一些细节
1. 重载方法与重写方法
a)重载方法(Overload)
多用于同一个类中;
重载方法的方法名完全相同, 参数列表不同
返回值不能参与区分重载方法
b)重写方法(Overwrite)
多用于继承父类的子类或接口实现类中;
重写方法中, 子类的方法名, 参数列表, 返回值, 访问修饰符应该与父类中的完全一致
2. 在没有为类提供构造器的情况下, 编译器会自动为该类添加一个默认构造器; 但是一旦为类指定了构造器, 则编译器就不会再自动添加默认构造器了.
3. 方法的方法名和参数列表组合起来作为 "方法的特征签名", 唯一的标识出某个方法;
4. static 的域或方法不跟类的对象绑定, 可以通过类名或方法名直接调用(不能在 static 方法中调用非静态方法);
非 static 的域或方法必须通过类的对象来调用;
static 关键字不能用于局部变量.
5. 在方法体的传入参数中: 基本数据类型在传递时是值传递(传递原值的拷贝值), 对象在传递时是引用传递.
6. 方法体内的局部变量存储在方法栈中, 类的成员变量存储在堆中.
7. 可变参数列表
语法格式: MethodName(类型... 参数名称)
使用示例:
五: 控制语句
1. break 和 continue
break: 用于强行退出当前循环
continue: 用于停止本次迭代, 然后返回起始处开始下一次迭代
2. 带标签的 break 和 continue
break outer: 中断当前循环并跳出标签所指的循环
continue outer: 重新跳到标签的位置, 并开始标签之后声明的循环
用法示例:
使用带标签的 break / continue 的原因是: 为了跳出或重新开始多层嵌套循环.
3. switch
switch 语句可以用于实现多路选择, 但是要注意 break 穿刺问题(即如果上一个 case 里没有 break 语句, 则该 case 执行完成后会顺势执行下一个 case 语句块).
来源: https://www.cnblogs.com/Dreamer-1/p/8805743.html