Java类变量已在对象创建时初始化,为何仍无法访问其值?
编译错误的核心原因
1. 触发报错的直接语法问题
你在Bill类中定义的setbillid、getbillid都是实例成员方法,不是类的成员变量。Java语法中调用实例方法时,必须在方法名后追加一对英文圆括号,需要传参的方法还要在括号内传入对应类型的参数。
不管是你贴出的“找不到变量setbillid”报错,还是main方法里写的b.getbillid访问逻辑,本质都是省略了方法调用必需的圆括号——编译器会顺着代码逻辑,在Bill类里查找和方法名同名的成员变量,自然找不到匹配的定义,最终抛出“找不到对应符号”的编译错误。
2. 概念认知的偏差
你提到“类变量会在对象创建时完成初始化”的表述存在偏差:
- 你代码中定义的
int billid是实例成员变量,不属于类变量。类变量需要被static关键字修饰,生命周期和类本身绑定,不依附于单个对象存在。 - 实例变量的初始化时机确实和对象创建绑定:对象在堆内存分配空间时,所有实例变量会自动完成默认值初始化(int类型的默认初始值为0),即使不手动调用setter方法赋值,通过getter方法也能正常拿到初始化后的默认值,不存在“无法访问类变量取值”的问题。
修正后的正确代码
public class Main{ public static void main(String[] args) { Bill b = new Bill(); // 调用getter方法必须带方法调用的圆括号 System.out.println(b.getbillid()); } }
修正后的代码可以正常编译运行,因为billid作为int类型实例变量默认初始值为0,控制台会输出0。如果要给billid设置自定义值,调用setter方法时也需要按照方法定义传入参数,即b.setbillid(123);。
内容的提问来源于stack exchange,提问作者Lakshya Gupta
相关产品推荐
相关产品推荐

