Java中成员变量和属性之间的关系

本文解析了在使用Java类成员变量时出现属性未定义错误的原因。通常成员变量通过set和get方法对外提供访问接口,但若方法命名不符合约定,会导致属性名称不匹配的问题。

有人可能遇到这样的错误,明明在类中定义了某个成员变量,但是系统在运行的时候提示错误:属性XX没有定义。这是什么原因呢?

大家知道成员变量有多种访问控制符,通常都应该把成员变量定义成私有的,然后为该成员变量提供set方法和get方法,外界通过set方法和get方法对成员变量进行操作。这样对外界来说,只有能够访问到的成员变量才算是属性,例如下面的代码:

private String userName;

public void setUserName(String userName){

   this.userName = userName;

}

public String getUserName(){

   return userName;

}

这时候我们说当前类有userName属性,注意要区分大小写。

另外还有一点非常重要,属性的名字不是由成员变量决定的。通常set方法和get方法的名字是set或者get加上成员变量的名字,成员变量的首字母要变成大写。而属性的名字是什么了,其实属性的名字就是去掉set或者get,然后把首字母变成小写。从这两个命名规则可以看出,通常属性名与成员变量的名字是一致的。但是,如果在写set方法和get方法的时候,没有按照默认的规则写,则属性名字和成员变量名字就一样了。看下面的例子:

private String userName;

public void setUsername(String userName){

   this.userName = userName;

}

public String getUsername(){

   return userName;

}

在上面的代码中,只修改了方法的名字(大写的N变成小写的n),这时候属性的名字已经由userName变成username了。如果要按照属性名字访问而不是直接访问get方法(例如,表达式语言),或者由框架自动完成属性的赋值(例如,对于WebWork,需要在Action中需要定义与表单元素相同名字的属性,对于Struts1,需要在ActionForm中定义与表单元素相同名字的属性),这时候就必须写username而不是userName,否则就抱错,就是本文开头所说的错误。

如果出现这样的错误,首先查看有没有定义set方法或者get方法,然后看看方法名字是否写的正确。

Java中,成员变量对象之间存在密切的联系。成员变量通常指的是实例变量[^2],它们对象的创建生命周期紧密相关。当一个类被实例化为对象时,每个对象都会拥有自己的一份实例变量副本,这意味着不同对象之间的实例变量是相互独立的。 实例变量的初始化发生在对象构造的过程中。在创建对象时,Java会为该对象分配内存空间,并将类中的实例变量初始化为其默认值或者通过构造函数指定的值。例如,对于`int`类型的实例变量,默认初始化值为`0`;而对于引用类型的实例变量,默认初始化值则为`null`[^1]。这种初始化过程确保了每个新创建的对象都有一个干净的状态开始其生命周期。 成员变量(即实例变量)的作用域限定于整个类中定义它们的方法之外,但可以在类中的任何方法内访问。这局部变量形成对比,后者仅在声明它们的方法或代码块内部有效。此外,由于成员变量属于对象的一部分,因此它们可以被多个方法共享并保持状态,而局部变量仅存在于执行线程到达其声明点时,并且不能被其他方法直接访问。 从内存分配的角度来看,实例变量存储在堆内存中,这是因为对象本身是在堆上创建的。每当一个新的对象被创建时,JVM就会在堆内存中为这个对象分配足够的空间来存放所有实例变量。相比之下,局部变量通常存储在栈内存中,它们的生命周期仅限于包含它们的方法或代码块的执行期间[^1]。 为了更好地理解成员变量对象之间关系,考虑以下简单的Java类示例: ```java public class Person { // 成员变量 - 实例变量 private String name; private int age; // 构造函数 public Person(String name, int age) { this.name = name; this.age = age; } // 方法 public void displayInfo() { System.out.println("Name: " + name); System.out.println("Age: " + age); } } ``` 在这个例子中,`name``age`是`Person`类的成员变量(实例变量)。当我们创建`Person`类的一个实例时,如`Person person1 = new Person("Alice", 30);`,每个`Person`对象都会有自己独立的`name``age`属性。这些属性随着对象的创建而存在,随着对象的销毁而消失。 总结来说,成员变量(实例变量)对象的关系体现在以下几个方面: - 每个对象都有自己的成员变量副本。 - 成员变量的生命周期它所属的对象相同。 - 成员变量提供了跨方法的数据共享能力,允许对象在其生命周期内维护状态。 - 成员变量存储在堆内存中,而局部变量则存储在栈内存中。 通过合理地使用成员变量,开发者能够设计出结构清晰、易于维护且功能强大的面向对象程序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值