5.6对象

Java是一门面向对象的程序设计语言,对象是由类实例化而来的,所有问题都通过对象来处理。对象可以通过操作类的属性和方法来解决相应的问题,所以了解对象的产生、操作和消亡是十分必要的。本节就来讲解对象在Java语言中的应用。

5.6.1对象的创建

在5.1节中曾经讲解过对象,对象可以认为是在一类事物中抽象出某一个特例,可以通过这个特例来处理这类事物出现的问题。在Java语言中,通过new操作符来创建对象。前文在讲解构造方法时介绍过,每实例化一个对象就会自动调用一次构造方法,实质上这个过程就是创建对象的过程。准确地说,可以在Java语言中使用new操作符调用构造方法创建对象。语法如下:

Test test = new Test();

Test test = new Test("a");

其参数说明如表1所示。

设置值 描述
Test 类名
test 创建Test类对象
new 创建对象操作符
"a" 构造方法的参数
[表1 创建对象语法中的参数说明]

test对象被创建出来时,就是一个对象的引用,这个引用在内存中为对象分配了存储空间。5.3节中介绍过,可以在构造方法中初始化成员变量,当创建对象时,自动调用构造方法。也就是说,在Java语言中,初始化与创建是被捆绑在一起的。

每个对象都是相互独立的,在内存中占据独立的内存地址,并且每个对象都具有自己的生命周期,当一个对象的生命周期结束时,对象就变成垃圾,由Java虚拟机自带的垃圾回收机制处理,不能再被使用。

注意:

在Java语言中,对象和实例事实上可以通用。

【例1】创建人类并创建其对象

创建人类(People类),类中有名字、年龄和性别3个属性,并为People类创建有参和无参两种构造方法。以人类为模板,创建两个对象,分别为23岁名叫tom的小伙子、19岁名叫lily的小姑娘。

public class People{

String name;

int age;

String sex;

public People(){

}

public People(String name,int age,String sex){

this.name = name;

this.age = age;

this.sex = sex;

}

public static void main(String[] args){

People p1 = new People("tom",23,"男");

People p2 = new People("lily",19,"女");

}

}

5.6.2访问对象的属性和行为

用户使用new操作符创建一个对象后,可以使用"对象.类成员"来获取对象的属性和行为。前文已经提到过,对象的属性和行为在类中是通过类的成员变量和成员方法的形式来表示的,所以当对象获取类成员时,也相应地获取了对象的属性和行为。

【例2】描述狗的特征

在Dog类中创建名字、颜色和声音3个属性,再创建一个"叫"的方法。以Dog类为模板创建两只狗,一只是白色且会汪汪汪叫的毛毛,一只是灰色且会嗷呜叫的灰灰。

java 复制代码
public class Dog{    //狗
    String name;    //名字
    String Color;    //颜色
    String vioce;    //声音

    public Dog(String name,String color,String vioce){
        this.name = name;
        this.Color = color;
        this.vioce = vioce;
    }

    public void call(){    //叫
        System.out.println(vioce);
    }

    public static void main(String[] args){
        Dog d1 = new Dog("毛毛","白色","汪汪汪");
        System.out.println(d1.name+"的颜色是"+d1.Color);    //访问对象的属性    
        System.out.print(",叫起来的声音:");
        d1.call();    //访问对象的行为

        Dog d2 = new Dog("灰灰","灰色","嗷呜~");
        System.out.println(d2.name+"的颜色是"+d2.Color);
        System.out.print(",叫起来的声音:");
        d2.call();
    }
}

运行结果如下:

毛毛的颜色是白色,叫起来的声音:汪汪汪

灰灰的颜色是灰色,叫起来的声音:嗷呜~

5.6.3对象的引用

在Java语言中,尽管一切都可以看作对象,但真正的操作标识符实质上是一个引用,那么引用在Java中是如何体现的呢?语法如下:

类名 对象的引用变量

例如,一个People类的引用可以使用以下代码:

People tom;

通常一个引用不一定需要有一个对象相关联。引用与对象相关联的语法如下:

People tom = new People();

实际上真正的对象是"new People()"这段代码。为了方便开发者保存、调用对象,于是创建了一个People类型、名叫tom的引用变量。实际上,tom只是一段内存地址,用于标记"new People()"对象在内存中的位置。因为内存地址又长又乱,很难让人记住,所以Java语言利用引用变量帮开发者标记内存地址。开发者只要记住引用变量的名字,就能够在内存里找到对象数据。简单来说,tom是new People()的"代理人"。

既然tom是new People()的"代理人",那么"new People()"对象能做的事,tom也能做。例如,下面这行代码:

new People().getClass();

等价于:

People tom = new People();

tom.getClass();

5.6.4对象的销毁

每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址需要被回收。在其他语言中,需要用户手动回收废弃的对象。Java拥有一套完整的垃圾回收机制,用户不必担心废弃的对象占用内存,垃圾回收器会自动回收无用却占用内存的资源。

在学习垃圾回收机制之前,读者首先需要了解何种对象会被Java虚拟机视为"垃圾"。主要包括以下两种情况:

☑ 对象引用超过其作用范围,这个对象将被视为垃圾,如下所示。

{

Examle e = new Example(); //对象e超过其作用范围,将消亡

}

☑ 将对象赋值为null,如下所示。

{

Examble e = new Example();

e = null; //当对象被置null值时,将消亡

}

虽然Java的垃圾回收机制已经很完善,但垃圾回收器只能回收那些由new操作符创建的对象。某些对象不是通过new操作符在内存中获取存储空间的,这种对象无法被垃圾回收机制所识别。在Java中,提供了一个finalize()方法,这个方法是Object类的方法,它被声明为protected,用户可以在自己的类中定义这个方法。如果用户在类中定义了finalize()方法,在垃圾回收时会首先调用该方法,在下一次垃圾回收动作发生时,才真正回收被对象占用的内存。

说明:

需要明确的是,垃圾回收或finalize()方法并不保证一定会发生。如果Java虚拟机内存损耗待尽,它将不会执行垃圾回收处理。

由于垃圾回收不受人为控制,具体执行时间也不确定,所以finalize()方法也就无法执行。为此,Java提供了System.gc()方法来强制启动垃圾回收器,这与给120打电话通知医院来救护病人的道理一样,主动告知垃圾回收器来进行清理。

相关推荐
格格步入8 小时前
🤔一次 OOM 排查(dump文件分析)
java·后端
蓝-萧8 小时前
Spring Security安全框架原理与实战
java·后端
Moe4888 小时前
CompletableFuture方法大全和使用详解(一步到位)
java·性能优化
郝学胜-神的一滴8 小时前
QAxios研发笔记(二):在Qt环境下基于Promise风格简化Http的Post请求
开发语言·c++·笔记·qt·网络协议·程序人生·http
敲代码的嘎仔8 小时前
数据结构算法学习day3——二分查找
java·开发语言·数据结构·学习·程序人生·算法·职场和发展
代码不停8 小时前
JavaEE多线程进阶
java·数据结构·java-ee
SimonKing8 小时前
聊聊Spring里那个不打扰Controller就能统一改响应的“神器”
java·后端·程序员
m5655bj8 小时前
如何使用 Python 转换 Excel 工作表到 PDF 文档
开发语言·c#·excel
鹓于8 小时前
Excel图片批量插入与文件瘦身
java·服务器·数据库