属性是对象具有的各种共性特征,声明在类中,属于类的成员之一,使用类的字段(Filed)代表该类对象的属性。每个对象的每个属性都拥有特定值。假设"狗"类的每个对象都有三个属性:年龄(以月为单位)、体重(单位为千克)、品种和毛色。"狗"类应当包含四个字段的声明分别表示年龄、体重、品种、毛色。
一般的交流中,通常直接使用属性来表示字段。后学我也会使用属性而不是用字段。
2.1 属性声明
属性声明在类体内部。在类中声明属性的一般语法是
[修饰符] class 类名{
[修饰符] <数据类型> <属性名> [= <初始值>];
}
属性声明可以使用零个或多个修饰符。属性的数据类型位于其名称之前。属性的初始值是可选的。
实际开发中,属性通常使用 private 修饰,private 修饰符确保属性只能在本类中访问,提高其安全性。本小节为了方便学习,先省略属性前的修饰符。
对于之前声明的Dog类,为了给它增加四个属性,可以使用如下写法:
public class Dog {
int age; // 年龄
float weight; // 体重
String breed; // 品种
String color; // 毛色
}
Dog类定义了四个属性:age、weight、breed 和 color。这四个字段有各自的数据类型。Dog 类的每一个实例(或对象)都会拥有这四个字段的副本。
可以看出来,声明属性的语法与声明变量几乎是一样的,其实这也是一种变量声明的形式,这样的属性称为实例属性(字段)或实例变量,每一个实例中实例变量可以有不同的属性值。
与之前我们在main方法中声明变量不同的是:
- 属性声明的语句放在类中,而变量声明的语句放在方法中
- 属性声明时会有默认初始值,而方法内变量声明是没有初始值的
- 属性前可以使用的修饰符与方法中变量声明时可以使用的修饰有所不同
2.2 属性的默认值
在将属性声明到类中时,可以为其赋初始值,也可以使用其默认值,属性的默认值与数组元素的默认值是相同的,根据属性的数据类型,默认值也不一样:
- 整型数值类型(byte、short、int、long)默认值是 0
- 浮点数值类型float、double)的默认值是0.0F和0.0D
- 字符类型(char)的属性默认值是 ASCII 码 0
- boolean 类型的属性默认值是 false
- 引用类型的属性默认值是 null
2.3 访问对象的属性
当类实例化后,就可以为对象的属性赋值,也可以获取属性的值。Java中使用"."运算符来访问对象成员:
实例名.属性名 = 表达式; // 赋值
变量 = 实例名.属性名; // 取值
下面以代码来演示属性的访问,首先为属性赋值,然后取属性的值:
public class DogTest {
static void main() {
// 实例化一个 Dog对象,取名erHa1
Dog erHa1 = new Dog();
// 为erHa1的4个属性赋值
erHa1.age = 3;
erHa1.weight = 4.2F;
erHa1.breed = "西伯利亚哈士奇";
erHa1.color = "灰色";
// 访问erHa1的4个属性并输出
System.out.println(erHa1.age);
System.out.println(erHa1.weight);
System.out.println(erHa1.breed);
System.out.println(erHa1.color);
}
}
这一次,当创建Dog类的实例时,为其中的4个属性赋值了,同时在内存中分配空间,示意图如下:

我们可以创建任意数量的"狗"类的实例。每次创建“"狗"类的实例时,JVM都会为它的4个实例变量分配内存,当然每个实例的同名属性值也可以不同。那么,一个"狗"类的实例会占用多少内存呢?我们并不能很确切的知道一个类的实例会占用多少内存,实际上,我们也不需要知道这一点。JVM会自动为处理内存的分配和释放工作。
如果使用 null 访问属性,则会引发空指针异常(NullPointerException),比如:
Dog erHa2 = null;
erHa2.age = 10;
运行时控制台会输出类似下面的错误信息:
Exception in thread "main" java.lang.NullPointerException: Cannot assign field "age" because "erHa2" is null
at com.laotan.article2.DogTest.main(DogTest.java:23)
如果要判断对象是否为 null ,可以使用 == 运算符:
Dog erHa2 = null;
if (erHa2 == null) {
System.out.println("变量为null");
} else {
erHa2.age = 10;
}
2.4 小结
本小节介绍了Java类中属性的声明与使用。属性是对象的共性特征,通过类字段表示。文章详细说明了属性的声明语法、默认值规则(如数值类型默认为0,引用类型默认为null)以及如何通过"."运算符访问对象属性。通过Dog类的实例演示了属性的赋值和取值操作,并强调了空指针异常的注意事项。最后指出JVM会自动处理对象属性的内存分配,开发者无需关心具体内存占用情况。

被折叠的 条评论
为什么被折叠?



