ACCP6.0 S2 使用Java实现面向对象编程 第一章 下载本文

从示例3中我们学习了Java中对象的创建和成员的调用方法,语法和C#中是相同的。 通过构造方法来创建对象,例如“Penguin p =new Penguin();”。 通过对象名.属性名的方式调用属性,例如 “p.name=”qq”;”。 通过对象名.方法名的方式调用方法,例如 “p.print();”。

类(Class)和对象(Object)是面向对象中的两个核心概念。类是对某一类事物的描述,是抽象的、概念上的定义。对象是实际存在的该事物的个体,是具体的、现实的。类和对象就好比模具和铸件的关系,建筑物图纸和建筑物实物的关系。我们可以由一个类创建多个对象。

示例1是一个Dog类的代码,示例2是一个Penguin类的代码。但是如果要实现我们的需求,只有类是不行的,还需要创建对应类的实例,也就是对象。在示例3中我们根据输入的数据创建了宠物对象并输出宠物信息。

规范

类名、属性名、方法名以及常量名的命名规范如下。

类名有一个或几个单词组成,每个单词的第一个字母大写,如Dog、StringBuffer。

属性名和方法名有一个或几个单词组成,第一个单词首字母小写,其他单词首字母大写,例如health、stuName、println()、getMessage()。

常量名由一个或几个单词组成,所有字母大写,如PI、SEX_MALE。

问题

如果我们创建了很多企鹅对象,他们的性别分别取值为“Q仔”或“Q妹”,但是后来要求变化,规定企鹅的性别只能取值“雄”或“雌”,此时已创建的每个企鹅对象的性别都要做相应修改,修改量很大,且代码可能分散在多个文件,不易查找,有没有更好的解决办法呢?

分析

可以定义两个常量SEX_MALE 和SEX_FEMAL,分别取值为“Q仔”和“Q妹”,再给企鹅赋值时直接将常量名SEX_MALE或SEX_FEMALE赋值给sex属性。如果以后要修改sex为“雄”或“雌”时,不管已创建了多少个对象,只需要修改两个常量的值就可以了,这样就方便很多。

final String SEX_MALE = “Q仔”: SEX_MALE是常量,值只能是“Q仔”,但是必须在创建对象后,通过对象名.SEX_MALE方式使用,很不方便。 static final String SEX_MALE = “Q仔”:SEX_MALE是常量,值只能是“Q仔”,可以在创建对象后,通过对象名.SEX_MALE方式,也可以直接通过类名.SEX_MALE方式使用,建议采用此种方式。

给企鹅类添加两个静态常量SEX_MALE和SEX_FEMALE,如示例4所示。 示例4 //**

*宠物企鹅类,使用静态常量。 */

public class Penguin{

String name = “无名氏”; //昵称

int health = 100; //健康值 int love = 0; //亲密度

static final String SEX_MALE = “Q仔”; static final String SEX_FEMALE = “Q妹”; String sex = SEX_MALE; //性别 /**

*输入企鹅的信息 */

public void print(){

System.out.println(“宠物的自白:\\n 我的名字叫” + this.name + “,健康值是” + this.health + “,和主人的亲密度是” + this.love +“,性别是 ” + this.sex + “。”);

} }

编写测试类,创建三个企鹅对象并对其性别赋值,如示例5所示。

示例5 /**

* 测试静态常量的使用。 * @author 北大青鸟 */

public class Text{

public static void main(String[] args){ Penguin pgn = null; pgn = new Penguin();

System.out.println(“第一个企鹅的性别是” + pgn.sex + “。”); pgn.sex = Penguin.SEX_FEMALE;

System.out.println(“第二个企鹅的性别是” + pgn.sex + “。”); pgn = new Penguin();

pgn.sex = Penguin.SEX_MALE;

System.out.println(“第三个企鹅的性别是” + pgn.sex + “。”); } }

运行结果如图1.7所示。

图1.7 输出企鹅的性别

如果要改变企鹅的性别取值为“雄”和“雌”,只需要修改Penguin类中的两个常量的值即可,如示例6所示,而创建对象的类如示例5所示,不用做任何修改。 示例6 /**

* 宠物企鹅类,使用静态常量

*/

public class Penguin{

String name = “无名氏”; int health = 100; int love = 0;

static final String SEX_MALE= “雄”; static final String SEX_FEMALE = “雌” String sex = SEX_MALE; /**

* 输出企鹅信息 */

public void print(){

System.out.println(“宠物的自白:\\n 我的名字叫” + this.name + “,健康值是” + this.health + “,和主人的亲密度是” + this.love +“,性别是 ” + this.sex + “。”);

} }

再次运行示例5,运行结果如图1.8所示。

图1.8 修改常量值后运行结果

static可以用来修饰属性、方法和代码块。static修饰的变量属于这个类所有,即由这个类创建的所有对象共用同一个static变量。通常把static休士顿属性和方法称为类属性(类变量)、类方法。不使用static修饰的属性和方法,属于单个对象,通常称为实例属性(实例变量)、实例方法。

类属性、类方法可以通过类名和对象名访问,实例属性,实例方法只能通过对象名访问。

final可以用来修饰属性、方法和类。用final修饰的变量称为常量,其值固定不变。关于final的具体内容会在第二章详细讲解。

1.2.2 构造方法及其重载

问题

在示例3中先创建对象,再给属性赋值,通过多个语句实现。例如: Penguin pgn = new Penguin(); pgn.name = name; pgn.sex = sex;

能不能在创建对象的时候就完成复制操作呢?

分析:

能!就是通过带参数的构造方法

下面就让我们先认真理解一条熟悉的陌生语句吧。

Penguin pgn = new Penguin();

在Penguin类中增加一个无参的Penguin(),如实例7所示,看看会出现什么情况。

示例7 /**

* 宠物企鹅类,测试无参构造方法。 * @author 北大青鸟 */

public class Penguin{

String name = “无名氏”; int health =100; int love = 0;

String sex = “Q仔”; /**

* 无参数的构造方法 */

public Penguin(){ name = “囡囡”; love = 20; sex = “Q妹”;

System.out.println(“执行构造方法”); } /**

* 输出企鹅的信息 */

public void print(){

System.out..println(“宠物的自白:\\n 我的名字叫” + this.name + “,健康值是” + this.health + “,和主人的亲密度是” + this.love +“,性别是 ” + this.sex + “。”);

} /**

* 测试无参构造方法的使用 */

public static void main(String[] args){ Penguin pgn = null; pgn =new Penguin(); pgn.print(); } }

运行结果如图1.9所示。

图1.9 显示构造方法被执行

其中Penguin()就是Penguin类的构造方法,从执行结果可以看到当执行语句pgn=new Penguin()时就会执行Penguin()中的代码。没有Penguin()时,系统会提供一个空的penguin()。

构造方法(Constructor)是一个特殊的方法,它用于创建类的对象,因此一个类必须包含至少一个构造方法,否则就无法创建对象。

构造方法的名字和类名相同,没有返回值类型。构造方法的作用主要就是在创建对象时执行一些初始化操作,如给成员属性赋初值。

让我们通过MyEclipse的断点追踪法来追踪构造方法的执行过程,从而更清楚、更直观的理解该过程。首先在示例7的main方法的“pgn = new Penguin();”语句来设置断点,然后以调试方式运行该程序,进入调试透视图并在断点处暂停,如图1.10所示。 图1.10 构造方法执行过程(一) 按调试窗口中的单步跳入按钮(或按F5键),进入Penguin类,连续按单步跳过按钮(或按F6键),首先执行Penguin类的属性定义语句一次给各属性赋初值,如图1.11所示。

继续按单步跳过按钮(或按F6键),会一次执行构造方法中的语句,用构造方法中的值替代属性初始值,如图1.12所示。

执行完构造方法内语句后,会跳回到如图1.10所示界面,表示创建对象成功,并把对象引用赋值给变量pgn,至此构造方法执行完毕。

问题:

示例7中通过构造方法完成了对象成员属性的赋值,但属性值已经在构造方法中写死了,能不能在创建对象的时候完成不同属性的动态赋值呢?

分析:

能!就是通过带参数的构造方法,这就涉及到了构造方法的重载。

为Penguin类增加两个有参的构造方法,如示例8所示。

示例8 /**

* 宠物企鹅类,指定多个构造方法 * @author 北大青鸟 */

public class Penguin{

String name = “无名氏”; int health = 100; int love = 0;

String sex = “Q仔”; /**