同一作用域内不可重复声明同名类,c++和java均报编译错误;不同命名空间或包、嵌套类、局部类可共用类名;前向声明可多次,但完整定义仅限一次;java还要求一个文件至多一个public类且文件名须匹配。

不能在同一个作用域内多次声明同一个类名。
同一作用域下类名必须唯一
无论是 C++ 还是 Java,只要在相同作用域中(如全局、同一命名空间、同一包、同一文件的顶层),重复定义同名类都会导致编译错误。
- C++ 中,两次 class MyClass { ... }; 出现在同一作用域,编译器报重定义错误
- Java 中,一个源文件里若出现两个 public class MyClass,直接编译失败;即使去掉 public,两个非 public 的同名顶层类(在同一文件)也非法
不同作用域可共用类名
类名可以“重复”,前提是它们位于互不干扰的作用域中:
- 不同命名空间(C++)或不同包(Java):比如 ns1::Data 和 ns2::Data 可并存
- 嵌套类:外部类 Container 内可定义 class Container { class Container { ... }; };(语法允许,但易混淆,一般不推荐)
- 局部类:函数内部定义的 class Helper,与其他函数里的同名局部类不冲突
声明 vs 定义要分清
类的前向声明(如 class X;)可以多次出现,它只是告诉编译器“X 是个类”,不构成定义;但一旦给出完整定义(含花括号和成员),就只能有一次。
- 合法:class A; → class B { A* p; }; → class A { int x; };
- 非法:class A { int x; }; 后再写一遍 class A { double y; };
Java 特别限制
Java 对文件级结构有额外约束:
- 一个 .java 文件最多一个 public class,且文件名必须与之完全一致
- 该文件中还可包含任意多个 package-private 类(无修饰符),但它们之间、与 public 类之间都不能同名
- 即便不编译,IDE 通常也会标记同名类为错误











