文章目录
本节我们将实现一个小的宠物店系统,可以领养小狗和企鹅。
1.使用继承
1.1 设计类图
如果不使用继承
我们两种宠物有很多相同的属性和方法,所以我们创建一个Pet类作为它们的子类。改进后类图
1.2 类代码
1.2.1 Pet类代码
package petShop;
public class Pet {
private String name;//成员变量
private int health;
private int love;
public Pet() {
// TODO Auto-generated constructor stub
health=100;
love=0;
}//无参构造方法,默认健康值为100,亲密度为0
public Pet(String name, int health, int love) {
super();
this.name = name;
this.health = health;
this.love = love;
}//带了三个参数的构造方法可以直接赋初值
//set和get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
//print方法可以打印宠物的属性
public void print(){
System.out.println("宠物的自白:");
System.out.println("我的名字叫"+name+",我的健康值是"+health+",我和主人的亲密程度是"+love);
};
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
1.2.2 Dog类代码
package petShop;
public class Dog extends Pet{//继承Pet
private String strain;//定义品种属性
//两种构造方法
public Dog() {
// TODO Auto-generated constructor stub
}
public Dog(String name, int health, int love,String strain) {
super(name, health, love);//super可以直接访问父类的构造方法
this.strain = strain;
}
//get、set方法
public String getStrain(){
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
//重新父类中的print()方法
@Override
public void print() {
// TODO Auto-generated method stub
super.print();
System.out.println("我是一只"+strain);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Dog d1 = new Dog("欧欧",100, 0, "雪纳瑞犬");
d1.print();
}
}
输出结果
1.2.3 Penguin类代码
//与Dog类相似
package petShop;
public class Penguin extends Pet{
private String sex;
public Penguin() {
// TODO Auto-generated constructor stub
}
public Penguin(String name, int health, int love,String sex) {
super(name, health, love);
this.sex = sex;
}
public String getSex(){
return sex;
}
public void setSex(String sex){
this.sex = sex;
}
@Override
public void print() {
// TODO Auto-generated method stub
super.print();
System.out.println("我的性别"+sex);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Penguin p1 = new Penguin("楠楠", 100, 0, "Q妹");
p1.print();
}
}
输出结果
1.3 第一阶段总结
继承可以减少我们的代码量,如果两个类存在许多相同的属性和方法,我们可以为其创造一个父类。
子类可以继承父类的属性和方法,但不是全部,有3类主要的内容无法被继承:1.构造方法(只能使用super来调用)2.private修饰的属性和方法 3.默认修饰符情况下,子类不在父类包中时也无法继承。
可以使用super关键字类访问父类中的方法,但是必须是在第一行。this是用来访问自己的构造方法,也需要放在第一行。所以在一个构造方法里面不可以同时有this和super。
如果我们不写super构造方法,那么系统自动会默认第一行是super(),若父类没有无参构造方法,那么会发生错误。
2.抽象类
如果我们不想让父类实例化,我们可以将其定义为是抽象类。在本次操作中,Pet类的实例化是没有意义的,因为不够具体,所以我们可以将其设为抽象类。
3 改进代码,实现宠物店功能
3.1 实现效果
3.2 实现代码
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.println("欢迎您来到宠物店");
System.out.println("请输入要领养的宠物的名字");
String name = in.next();//用name变量存储名字
System.out.println("请选择要领养的宠物类型(1、狗狗2、企鹅)");
int type=in.nextInt();
if(type==1){
System.out.println("请选择狗狗的品种(1、阿拉斯加 2、哈士奇)");
type=in.nextInt();
String strain;
if(type==1) strain="阿拉斯加";
else if(type==2) strain="哈士奇";
else{
System.out.println("请输入正确的序号");
return;
}
Dog p1 = new Dog();
p1.setName(name);
p1.setStrain(strain);
p1.print();
}
else if(type==2){
System.out.println("请选择企鹅的性别(1、Q仔 2、Q妹)");
type=in.nextInt();
String sex;
if(type==1) sex="Q仔";
else if(type==2) sex="Q妹";
else{
System.out.println("请输入正确的序号");
return;
}
Penguin p1 = new Penguin();
p1.setName(name);
p1.setSex(sex);
p1.print();
}
else{
System.out.println("请输入正确的序号");
}
}