前言
Java语法注意事项
编程不仅是让机器理解指令的艺术,更是开发者与未来自己(或同事)沟通的桥梁。在Java的世界里,语法规则如同交通信号------严格遵守能让代码流畅运行,而细微的疏忽则可能导致隐蔽的错误或性能瓶颈。
本系列将聚焦Java编程中那些容易被忽略却至关重要的语法细节。不同于基础教程的系统性介绍,这里汇集的是实际开发中常见的"陷阱"、最佳实践的"为什么",以及语言特性的"正确打开方式"。
final类用法
| 应用对象 | 效果 | 示例 |
|---|---|---|
| 基本类型变量 | 值不能改变 | final int x = 5; |
| 引用类型变量 | 引用不能改变(对象内容可变) | final List list = new ArrayList(); |
| 实例变量 | 必须在构造结束前初始化 | final String name; |
| 静态变量 | 必须在静态初始化完成前初始化 | static final int MAX; |
| 参数 | 方法内不能修改参数值 | void method(final int x) |
| 方法 | 子类不能重写该方法 | public final void method() |
| 类 | 不能被继承 | final class MyClass |
final变量(常量)
java
final int MAX_VALUE = 100;
MAX_VALUE = 200; // 编译错误!不能重新赋值
引用类型变量
java
final List<String> list = new ArrayList<>();
list.add("item"); // ✅ 可以修改对象内容
list = new ArrayList<>(); // ❌ 编译错误!不能重新指向新对象
final参数
java
void process(final int value) {
value = 10; // ❌ 编译错误!不能在方法内修改
}
final实例变量
java
class Person {
final String name; // 必须在构造器中初始化
Person(String name) {
this.name = name; // ✅ 构造器中初始化
}
void setName(String newName) {
this.name = newName; // ❌ 编译错误!
}
}
final方法
禁止子类重写
java
class Parent {
public final void cannotOverride() {
System.out.println("This cannot be overridden");
}
public void canOverride() {
System.out.println("This can be overridden");
}
}
class Child extends Parent {
@Override
public void cannotOverride() { // ❌ 编译错误!
System.out.println("Trying to override");
}
@Override
public void canOverride() { // ✅ 可以重写
System.out.println("Overridden");
}
}
final与private的关系
java
class Parent {
private void method1() { } // 隐式final,因为子类不可见
public final void method2() { }
}
final类
禁止继承
java
final class String { // java.lang.String是final类
// ...
}
class MyString extends String { // ❌ 编译错误!不能继承final类
}
常见final类示例
java
// Java标准库中的final类:
final class Integer extends Number { ... }
final class Math { ... }
final class System { ... }
final class String { ... }