学会继承、多态、封装(1)——Java实现宠物店(领养宠物)

时间:2024-04-13 09:04:59


本节我们将实现一个小的宠物店系统,可以领养小狗和企鹅。

1.使用继承

1.1 设计类图

如果不使用继承
学会继承、多态、封装(1)——Java实现宠物店(领养宠物)
我们两种宠物有很多相同的属性和方法,所以我们创建一个Pet类作为它们的子类。改进后类图
学会继承、多态、封装(1)——Java实现宠物店(领养宠物)

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)——Java实现宠物店(领养宠物)

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)——Java实现宠物店(领养宠物)

1.3 第一阶段总结

继承可以减少我们的代码量,如果两个类存在许多相同的属性和方法,我们可以为其创造一个父类。
子类可以继承父类的属性和方法,但不是全部,有3类主要的内容无法被继承:1.构造方法(只能使用super来调用)2.private修饰的属性和方法 3.默认修饰符情况下,子类不在父类包中时也无法继承。

可以使用super关键字类访问父类中的方法,但是必须是在第一行。this是用来访问自己的构造方法,也需要放在第一行。所以在一个构造方法里面不可以同时有this和super。
如果我们不写super构造方法,那么系统自动会默认第一行是super(),若父类没有无参构造方法,那么会发生错误。

2.抽象类

如果我们不想让父类实例化,我们可以将其定义为是抽象类。在本次操作中,Pet类的实例化是没有意义的,因为不够具体,所以我们可以将其设为抽象类。

3 改进代码,实现宠物店功能

3.1 实现效果

学会继承、多态、封装(1)——Java实现宠物店(领养宠物)

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("请输入正确的序号");
		}
	}