类声明不必用public修饰符,但一个源文件至多一个public类且文件名须与之完全一致;无显式构造器时编译器提供包级无参默认构造器,一旦定义任一构造器即消失;main方法必须为public static void main(String[] args)才能被JVM识别。

Java中定义一个类,核心是用 class 关键字加类名,但真正决定类是否可用、能否被正确实例化或继承的,是修饰符、构造器、成员变量和方法的组合方式——不是写出来就行,得写对位置、写对访问级别、写对初始化逻辑。
类声明必须包含 public 修饰符吗?
不一定。一个源文件中最多只能有一个 public 类,且文件名必须与该类名完全一致(包括大小写)。如果类不声明为 public,它默认具有包级访问权限(package-private),只能被同一包下的其他类访问。
- 想让类被其他包使用 → 必须加
public - 只是内部工具类、辅助类 → 可省略
public,更安全 - 多个非
public类可以共存于同一文件(但不推荐)
构造器没写会怎样?
Java 会自动提供一个无参、包级访问权限的默认构造器 —— 仅当类中**完全没有显式定义任何构造器**时才存在。一旦你写了任意一个构造器(哪怕带参数),默认构造器就立刻消失。
public class User {
private String name;
// 写了这个带参构造器后,new User() 就编译报错
public User(String name) {
this.name = name;
}
}
- 依赖框架(如 Spring、Jackson)反射创建实例时,若缺少无参构造器,常抛
InstantiationException或NoSuchMethodException - 需要序列化/反序列化时(如 JSON 转对象),多数库默认要求无参构造器
- 若必须有参构造,又需兼容框架,建议手动补上
public User() {}
成员变量要不要在声明时初始化?
可以初始化,但要注意时机和语义。Java 对不同位置的初始化做了严格区分:
立即学习“Java免费学习笔记(深入)”;
- 声明时赋值(如
private int count = 0;)→ 在构造器执行前完成,属于实例创建的一部分 - 在构造器中赋值 → 更灵活,可基于参数做逻辑判断
- 在实例代码块(
{ ... })中赋值 → 少用,执行顺序在声明初始化之后、构造器之前,易混淆 - 静态变量用
static修饰,只初始化一次;实例变量每次 new 都重初始化
常见错误:把本该在构造器里校验的逻辑(如参数非空检查)挪到声明初始化中,导致无法捕获异常或无法访问构造参数。
main 方法为什么必须是 public static void?
这是 JVM 启动入口的硬性约定,缺一不可:
-
public→ JVM 跨包调用,必须可访问 -
static→ 不依赖实例,JVM 直接通过类名调用 -
void→ JVM 不处理返回值,返回值无意义 - 方法名必须是
main,参数必须是String[] args(或String... args)
写成 private static void main(...) 或 public void main(...) 都会导致 “Error: Main method not found” —— 这不是语法错误,而是 JVM 找不到符合签名的入口点。
类结构看似简单,但修饰符作用域、初始化顺序、构造器可见性这些细节,往往在模块拆分、框架集成或单元测试时突然暴露问题。尤其注意:IDE 自动生成的代码(如 Lombok 的 @Data)会隐式添加构造器和 getter/setter,可能掩盖原本缺失的无参构造器问题。










