什么是类?
类在Java中处于核心地位。类定义了对象的外形和属性,它是一种逻辑结构,整个Java语言基于类而构建。
理解类最重要的一点是,类定义了一种新的数据类型。一旦定义一个类,就可以使用这种新的类型创建该类型的对象。因此,类是对象的模板,对象是类的实例。
在类中定义的数据或变量称为实例变量,代码包含在方法中。在类中定义的方法和变量都称为类的成员。在类中定义的变量之所以被称为实例变量,是因为类的每个实例(即类的每个对象)都包含这些变量的副本。
一个简单的类
public class Box {
public double width;
public double height;
public double depth;
}
类定义了一种新的数据类型,在这个例子中,新的数据类型被称为Box。
注意:类的声明仅创建了一个模板,它没有创建实际的对象。
声明对象
Box myBox = new Box();
上述代码是创建了一个对象,但是创建对象是分两步的。
第一步:必须声明类类型的一个变量(Box myBox),这个变量没有定义对象,它只是一个引用对象的变量。
第二步:使用new运算符。动态的(在运行时)为对象分配内存,并返回指向对象的引用。这个引用基本上是由new为该对象分配的内存地址。然后将这个引用存储在变量中。
注意:在Java中所有类对象都必须动态分配,也就是说想要一个对象就要new一个。
Box myBox;
myBox = new Box();
这种写法可能更清晰一点。
new 运算符
new 运算符动态地为对象分配内存,这种方式的优点是,可以创建在程序运行期间所需要的人数数量的对象。
可能有一个问题,为什么整数(int)或字符(char)这些类型不使用new关键字?
答:Java的基本类型不是最为对象实现的,反而它们是作为“常规”变量实现的。这样做的目的是提高效率。由于为对象应用的开销与为基本类型应用的开销不同,因此Java可以更高效地实现基本类型。
为对象引用变量赋值
注意:当进行赋值是,对象引用变量的行为可能和您所期望的不同。
先看一段代码
Box b1 = new Box();
Box b2 = b1;
你可能认为,b2被赋值为b1所引用对象的副本的引用,也就是说,你可能认为b1和b2引用的是相互独立的、不同的对象。但是这种想法是错误的,因为b1 和b2会引用同一个对象。将b1赋值给b2不会分配内存,也不会复制原始对象的任何部分,而只是简单的使用b2引用b1所引用的同一个对象。因此,通过b2对对象所做的任何修改,都会影响b1所引用的对象,因为它们本来就是同一个对象。图栗
注意:当将一个对象引用变量赋值给另外一个对象引用变量时,不是创建对象的副本,而是创建引用的副本。
方法
类通常由两部分组成:实例变量(成员变量)和方法。
type name(parameter-list)
{
//body of method
}
type 指定了方法返回的数据类型,可以是任何有效的类型,包括创建的类类型。如果方法没有返回值,它的返回类型必须是void。如果返回类型不是void,使用return 语句为调用例程做返回。
name 指定了方法的名称,可以是任何合法的标识符。
parameter-list 是一系列由逗号隔开的类型和标识符对。参数在本质上是变量,当调用方法时,它们接收为方法传递的参数的值。如果方法没有参数,参数列表为空。
栗子1
public void method1()
{
//此方法无返回值
}
public void method2(String str)
{
//此方法无返回值,并且有一个String类型参数
}
栗子2
public String method1()
{
//此方法有一个String类型的返回值
return "";
}
public String method2(String str)
{
//此方法有一个String类型的返回值,并且有一个String类型参数
return str;
}
构造函数
因为初始化需求非常普遍,所以Java允许在创建对象时初始化对象自身。这种自动初始化是通过构造函数实现的。
构造函数在创建对象之后立即初始化对象。构造函数的名称和包含的类的名称相同,并且在语法上和方法类似。一旦定义构造函数,就会在创建对象之后、new运算符完成之前,立即自动调用构造函数。
构造函数看起来有些奇怪,因为它没有返回值类型,也不返回void类型。构造函数的任务是初始化对象的内部状态。
public Box()
{
//无参构造函数
}
this关键字
有时,方法需要引用调用它的对象。为了能够进行这种操作,Java定义了this关键字。可以再任何方法中使用this引用当前对象。也就是说this代表当前对象。
public Box()
{
//无参构造函数
this.width = 10;
this.height = 20;
this.depth = 30;
}
隐藏实例变量
当局部变量和实力变量相同名称时,局部变量隐藏了实例变量。
public class Box {
public double width;
public double height;
public double depth;
public void method(double width)
{
System.out.print(width);
}
}
上面的例子只会输出参数列表传过来的值。因为参数列表中的变量名与实例变量中的变量名相同,程序会自动隐藏实例变量。如果想输出实例变量,那么就需要使用this关键字,例如System.out.print(this.width);