类是对某一类事务的描述,是抽象的、概念上的定义;对象是实际存在的该类事务的个体,因而也称实例。可见,类描述了对象的属性和对象的行为,一个类可以对应多个对象。
一、对象
1.new关键字
在Java编程中,我们通过使用new关键字和想要创建对象的类名来实例化一个类的对象。实例化对象作用,是为对象分配内存,由new操作符根据构造方法决定新建对象分配多大的内存来存储对象。new操作符需要一个参数,就是类的构造方法,构造方法是用于初始化对象的特别方法。new操作符为对象分配内存后将调用类的构造方法确定对象的初始状态(即为类的成员变量赋初值)。举例如下:
Person p1=new Person();
其中,变量p1就是对象的引用句柄,对象的引用句柄是在栈中分配的一个变量,对象本身是在堆中分配的。
2.对象的比较
我们刚说到如何去创建一个对象,但往往在开发中同类的多个对象会存在对象之间的比较。Java提供了两种方法用于对象间的比较:"=="运算符与equals()方法。
(1)"=="操作符
用于比较两个变量的值是否相等,可以理解为基本(引用)数据类型变量的比较情况。
(2)equals()方法
equals()方法是String类的一个成员方法,用于比较两个引用变量所指向的对象的内容是否相等。
如:String str1 = new String("abc");
String str2 = new String("abc");
String str3=str1;
如果通过"=="操作符来判定,那么:str1!=str2,str1==str3。因为str1和str2分别指向了两个新创建的String类对象,他们是两个彼此独立的对象,为占据不同内存空间地址的两个对象。str1和str2分别是这两个对象的句柄,分别是这两个对象的内存地址,显然他们的值是不相等的。而
如果使用equals()方法判定,那么:str1=str2,str1=str3。因为str1、str2、str3三个对象的内容都为"abc",所以它们之间是相等的。
3.匿名对象
创建完对象,在调用该对象的方法时,也可以不定义对象的句柄,而直接调用这个对象的方法,这样的对象就叫做匿名对象,比如new
Person().shout()。 使用匿名对象有两种情况:
(1)如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
(2)将匿名对象作为实参传递给一个函数调用。
举例说明:程序中有一个getSomeOne函数,要接收一个Person类对象作为参数。
函数的定义如下:
public static void getSomeOne(Person p)
{......}
可以看出,该函数在使用时需要给其传入一个参数,所以我们在调用该函数时可以这样:getSomeOne(new Person());即定义一个Person类的匿名对象作为该函数的实参。
二、构造方法
1.构造方法
构造方法在程序设计中非常有用,它可以为类的成员变量进行初始化工作,当创建一个类的实例对象后,这个类的构造方法会被自动调用。与成员方法不同的是构造方法一般具有以下几个特点:
(1)它具有与类相同的名称;
(2)它不含返回值;
(3)它不能在方法中用return语句返回一个值。
注释:构造方法的名称之所以要与类的名称相同,因为构造方法由Java编译器负责调用,而编译器必须知道哪一个才是构造方法。
2.构造方法的重载
我们在实现一个类时,可以不实现构造方法,因为系统会为程序自动生成一个空的构造方法(方法中不包含任何代码)供系统自动调用。构造方法的重载通过传递不同的参数列表来实现,且可以完成不同初始化的操作。在创建一个实体对象时,到底使用的是哪一个构造方法,Java会根据在括号中传递的参数来自动选择相应的构造方法,即new
类名(参数列表)。
下面分析一个构造方法具体实现了什么功能:
Person
p=new Person("Tom",18);其中,p为对象的引用句柄。
(1)创建了Person类的一个实例对象;
(2)在堆内存中为实例对象分配内存空间;
(3)调用指定类的构造方法,将实例对象的内容的首地址赋值给引用变量(引用句柄)p。
内 存 分 析
a.首先,实例化一个对象Person p=new Person("Tom",18),生成一个引用句柄p,系统自动初始化Person类中的成员变量。
b.其次,执行构造方法中的代码,用从外部接受到的姓名和年龄对成员变量重新赋值
this.name=name;
this.age=age;此时的内存状态为:
c.最后,把刚刚创建的对象赋值给引用变量。
3.构造方法总结
(1)在Java的每个类里都至少有一个构造方法,如果我们没有在一个类里定义构造方法,那么系统会自动为这个类生成一个默认的构造方法,这个默认构造方法没有参数,在其方法体中也没有任何代码,即不做任何事。
(2)构造方法一般都是public的,因为它们在对象产生时,会被系统自动调用,以便被外部调用。
(3)在创建一个对象语句中,如Person p=new Person(),其中引用变量p为对象的引用句柄,不是对象本身,我们可以通过引用变量p来操作对象中的属性(成员变量)和行为(成员方法)。