Java 语言规范(JLS)怎么说?
在 JLS §8.3. Field Declarations 中,明确使用了:
FieldDeclaration:
{FieldModifier} Type VariableDeclaratorList ;
并举例:
1int x =10;// field declaration with initializer2String name;// field declaration without initializer
✅ 所以:int x = 10; 被 JLS 称为 “field declaration”(字段声明),其中 = 10 是 initializer(初始化器)。
因此,“字段声明中的初始化”或“声明时初始化”是完全符合规范的说法。
2. Java 中有没有“纯声明” vs “定义”的区分?
没有。
在 C/C++ 中:
extern int x; → 告诉编译器“x 存在,但不在这里分配内存”int x = 10; → 分配内存 + 可选初始化在 Java 中:
int x; 或 int x = 10;)都是定义:它们在类加载/对象创建时分配存储空间。public static final 常量,但那属于特殊情况)。📌 换句话说:在 Java 中,“声明” ≈ “定义”,因为每次声明都会导致存储分配。
| 语言 | 是否区分 declaration / definition? | 主要术语 | 原因 |
|---|---|---|---|
| C / C++ | ✅ 严格区分 | declaration(声明) vs definition(定义) |
支持分离编译、链接,需明确符号存在性与存储分配 |
| Java | ❌ 不区分 | 统一叫 declaration(声明) |
没有头文件,无链接阶段,所有“声明”都隐含定义 |
| Python | ❌ 无此概念 | 没有 declaration/definition 的区分 | 动态类型、运行时绑定,变量/属性在赋值时才“出现” |
🔸 没有“提前告知”的机制
🐍 所以:Python 中既没有 declaration,也没有 definition —— 只有“绑定(binding)”或“赋值(assignment)”