Java中成员变量分实例变量(每个对象独立,随对象创建初始化)和静态变量(类共享,类加载时初始化);方法需明确修饰符、返回类型和参数列表,static方法不能访问实例成员;封装要求成员变量私有、通过getter/setter控制访问。
Java中成员变量和方法的定义,核心在于明确它们
属于类还是实例、何时初始化、能否被外部访问。关键不是“能不能写”,而是“为什么这样设计”。
成员变量写在类内部、方法外部,分为两类:
static,每个对象独立一份,随对象创建而分配内存,初始值由类型默认给出(如int为0,Object为null);static修饰,属于类本身,所有实例共享同一份,类加载时初始化,常用于计数器、配置常量等。建议:优先使用实例变量;静态变量需谨慎,避免意外共享状态;常量推荐用public static final并大写命名(如MAX_SIZE)。
方法定义格式为:[修饰符] 返回类型 方法名(参数列表) { 方法体 }。重点看三处:
public(任意位置可调)、private(仅本类可用)、static(无需实例即可调,不能直接访问实例变量);void;注意:static方法中不能用this或直接调用非static成员,这是编译期强制限制,源于静态上下文与实例生命周期分离。
成员变量通常设为private,通过public的getter/setter方法暴露必要操作——这不是形式主义,而是为了后续可加校验、日志、通知等逻辑。
例如:setAge(int age)里可以检查age > 0 && age ,比直接赋值person.age = -5更安全可靠。
方法则按实际使用范围设定:工具类方法多为public static,内部辅助逻辑可用private,子类需要扩展的考虑protected。
实例变量在构造器执行前初始化(先执行字段初始化表达式,再执行构造器代码块,最后是构造器主体);静态变量在类首次主动使用时初始化,且只执行一次。
常见陷阱:在静态变量初始化时调用尚未加载的类,或在实例变量初始化中引用this(此时对象还未构建完成),会导致编译错误或NullPointerException。
建议:复杂初始化逻辑尽量移入构造器或专用初始化方法,提高可读性和可控性。