内容发布更新时间 : 2024/11/2 20:22:29星期一 下面是文章的全部内容请认真阅读。
* 无参构造方法 */
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;
}