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

* 无参构造方法 */

public Penguin(){ name = “囡囡”;

love = 20; sex = “Q妹”;

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

* 两个参数构造方法 */

public Penguin(String name,String sex){ this.name = name; this.sex = sex; } /**

* 四个参数构造方法 */

public Penguin(String name,int health,int love,String sex){ this.name = name; this.health = health; this.love = love; this.sex = sex; } /**

* 输出企鹅信息 */

public void print(){ System.out.println(\宠物的自白:\\n 我的名字叫\,健康值是\,和主人的亲密度是\,性别是\。\ } /**

* 测试构造方法的使用。 */

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

pgn = new Penguin(); pgn.print(); pgn=new Penguin(\亚亚\企鹅\ pgn.print(); pgn=new Penguin(\美美\仔\ pgn.print(); }

}运行结果如图1.13所示。

示例8中共有三个构造方法,方法名相同,参数列表不同,这成为构造方法的重载。可以通过构造方法重载来实现多种初始化行为,我们在创建对象的时候可以根据需要选择合适的构造方法。

下面我们把示例8中无参数的构造方法注释掉,看看会出现什么情况。 运行结果如图1.14所示。

为什么会出现这个错误呢?同C#一样,在没有给类提供任何构造方法时,系统会提供一个无参的方法为空的默认构造方法。一旦提供了自定义构造方法,系统将不会再提供这个默认构造方法。如果要使用它,程序员必须手动添加。强烈建议此时为Java类手动提供默认构造方法。

学习了创建对象,如何销毁对象呢?在Java中,对象的销毁不需要程序员来做,而是通过Java系统中的垃圾回收器再后台自动实现。 如果同一个类中包含了两个或两个以上方法,它们的方法名相同,方法参数个数或参数类型不同,则称该方法被重载了,这个过程称为方法重载。成员方法和构造方法都可以进行重载。

其实之前我们已经无形之中在使用方法重载了。

例如:

System.out.println(45); System.out.println(true);

System.out.println(“狗狗在玩耍!”);

例如:java.lang.Math类中的max方法就实现了重载,如图1.15所示。

注意:

方法重载的判断依据如下。 必须是在同一个类里。 方法名相同。

方法参数个数或参数类型不同。

与方法返回值和方法修饰符没有任何关系。

1.2.3 常见错误

1.在类中可以定义static变量,在方法里是否可以定义static变量

常见错误1 /**

* 宠物狗狗类,测试方法中是否可以定义static变量。 * @author 北大青鸟 */ class Dog{ String name = “无名氏”;

int health = 100; int love = 0;

public void play(int n){ static int staticVar = 5; health = health – n;

System.out.println(name + “ ” + staticVar + “ ” + health); }

public static void main(String[] args){ Dog d =new Dog(); d.play(5); } }

运行结果如图1.16所示。

把static int localv = 5;语句改为int localv=5;,则问题解决。

结论:在方法里不可以定义static变量,也就是说类变量不能是局部变量。 2.给构造方法加上返回值类型会出现什么情况

常见错误2 /**

* 宠物企鹅类,给构造方法加上返回值类型会出现什么情况呢? * @author 北大青鸟 */

class Penguin { String name =”无名氏”; int health=100; String sex=”Q仔”; /** * 给无参构造方法加上返回值类型为void */ public void Penguin(){ name=”欧欧”;

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

* 输出企鹅的信息 */

public void print(){ System.out.println(“企鹅的名字是”+name+”,性别是”+sex+”。”); }

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

}

运行结果如图1.17所示。

从运行结果,我们可以看到,Penguin()方法并没有执行,这是为什么呢?不符合构造方法的定义,自然就不是构造方法了,不会在创建对象时执行。

结论2:构造方法没有返回值类型。如果有,就不是构造方法,而是和构造方法同名的成员方法。

1.3 使用封装优化电子宠物系统的类

问题:

设计的类有没有缺陷呢?比如执行语句 d=new Dog(); d.health=1000;

再比如示例8中的语句

Penguin pgn = new Penguin(“亚亚”,”企鹅”); pgn.print();

这些语句在语法上是完全正确的,但是却不符合实际规定,因为我们规定最大health值是100,企鹅的性别只能是Q仔或Q妹。再比如如果一个类有年龄、成绩属性,实际中是有取值范围的,随意赋值也会出现同样的问题。

分析:

在Java中已经考虑到了这种情况,解决途径就是对类进行封装,通过private 、protectecl、public和默认权限控制符来实现权限控制。在此例中,我们将属性均设为private权限,将只在类内可见。然后再提供public权限的setter方法和getter方法实现对属性的存取,在setter方法中对输入的属性值的范围进行判断。

采用类图来表示封装后的Dog类和Penguin类,运行结果如图1.18和图1.19所示,请大家把他们和图1.3以及图1.4进行比较,看有什么不同。

对Dog类进行封装处理,如示例9 所示。

示例9 /**

* 宠物狗狗类,使用权限修饰符private和public进行封装。 * @author 北大青鸟 */

class Dog{

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

private String strain=”聪明的拉布拉多犬”; /**

* 读取狗狗昵称 * @return 昵称 */

public String getName(){ return name;

} /**

* 指定狗狗昵称

* @param name 昵称 */

public void setName(String name){ this.name=name; } /**

* 读取狗狗健康值 * @return 健康值 */

public int getHealth(){ return health;

} /**

* 指定狗狗健康值,对健康值范围进行判断 * @param health 健康值 */

public void setHealth(int health){ if(health>100|| health<0){ this.health=40; System.out.println(“健康值应该在0和100之间,默认值是40”); }else{ this.health=health;

}

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4