第五章 对象(1.3)
3.1、创建对象
被声明过的类可以用来创建对象,所谓的创建对象就是声明变量并初始化的过程。
创建对象的语法格式:
类名 对象名;
对象名 = new 类名();
或者
类名 对象名 = new 类名();
下面是一个实例:
public class Test1 {
public static void main(String[] args) {
// 声明一个Student类型的变量
Student stu1;
// 创建一个Student类型的对象并通过"=="初始化变量stu1
stu1 = new Student();
// 或者写在一起
Student stu2 = new Student();
}
}
解释:
- 1.使用
new
运算符创建对象,实质就是为对象在堆内存中分配内存空间。 - 2.
new Student()
会创建一个Student类的对象,这个过程也叫做实例化一个Student类的对象。 - 3.一个类可以实例化多个对象,不同对象在内存中是独立的。
3.2、使用对象
对象被创建后(或称被实例化后),这个对象就拥有了所属类的属性和方法,对象可以使用“.
”运算符来访问属性(访问成员变量)或执行行为(调用成员方法)。
下面是一个示例:
public class Test {
public static void main(String[] args) {
Student stu = new Student();//对象的创建
// 向对象的属性赋值
stu.name = "林冲";
stu.age = 21;
stu.studentNo = "10001";
// 调用对象的方法
stu.introduce();
}
}
本例中,在main
方法中声明了一个Student类型的变量stu,并实例化了一个Student类型的对象,赋值给了变量stu,之后通过变量stu访问了该对象的属性并对属性进行了赋值,最后调用了该对象的方法introduce()
。
3.3、对象的内存分配
上面示例中的代码在运行时,内存中是怎样变化的呢,下面用图示来说明:
解释:
执行代码Student stu
时,在main
方法对应栈帧的局部变量表中,为Student类型的变量stu分配一块内存。
执行stu = new Student()
时,首先,new操作符会让JVM
(虚拟机)在堆内存中分配一块内存空间(最主要的就是为属性分配内存空间),用来存储一个Student类型的对象,之后,赋值操作会将堆内存中已经分配好的内存空间的首地址存储到变量stu在局部变量表里对应的位置。
在堆内存中为刚才创建的Student对象的name
属性,age
属性,studentNo
属性赋值,即向这些变量对应的内存中存入值,基本数据类型存具体数据,引用类型存内存地址编号。
注意:
实例化一个Student对象时,该对象的属性是具有初始值(默认值)的,byte、short、int、long
类型的属性的初始值是0
,float、double
类型的属性的初始值是0.0
,boolean
类型的属性的初始值是false
,char
类型的属性的初始值是’\u0000
’,引用类型的属性的初始值是null
。
下面是一个示例:
public class Test2 {
public static void main(String[] args) {
Student stu = new Student();
stu.introduce();
}
}
输出的结果将是:
大家好,我是null,我今年0岁,我的学号是:null
事实上,在堆中分配内存,总会默认的进行初始化,堆中分配的内存中总是有初始值;而在栈中分配内存,则需要显式的初始化。
3.4、空指针 null
观察并运行下面的示例:
public class Test {
public static void main(String[] args) {
Student stu;
stu = null;
stu.introduce();
}
}
当执行stu.introduce()时,程序会抛出一个异常,如下:
Exception in thread "main" java.lang.NullPointerException
at com.luas.test.Test.main(Test.java:5)
造成这个异常的原因就在于stu = null
这一句代码,将变量stu赋值为null。
引用类型的变量应该存储一个内存地址编号,而null值则表明变量没有引用任何内存地址编号,是一个空引用。当变量的值是null时,访问属性或调用方法,都将会抛出NullPointerException
。