多态知识整理&实现主人与宠物玩耍功能

本文探讨了Java中多态性的概念、实现条件、优点和缺点。通过主人与宠物玩耍的例子,阐述了多态如何简化代码并提高扩展性。同时,介绍了向上转型和向下转型的用法,以及如何解决因多态导致的无法访问子类特有方法的问题。最后,展示了如何利用多态实现主人与不同宠物玩耍的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.为什么需要多态?

面想对象的三大基本特点特点封装、继承、多态。下面通过一个例子说明为什么需要多态。比如单词cut,在医生口中的意思是动手术,在导演口中意思是暂停,在理发师口中意思是剪头发。
总结:生活中,同一个动作在不同环境下表现出来的不同状态;Java中: 同一个方法在不同的对象中体现出来不同的状态;内存中: 父类引用指向子类对象
多态的实现的必要条件:

  • 1.存在继承关系
  • 2.存在方法重写
  • 3.父类引用指向子类对象
class Man {
   
   
	public void cut() {
   
   
		System.out.println("我是man, 我也不知道怎么cut");
	}
}

class Doctor extends Man {
   
   
	public void cut() {
   
   
		System.out.println("动手术");
	}
}

class Director extends Man {
   
   
	@Override
	public void cut() {
   
   
		System.out.println("暂停");
	}
}

class Hairdresser extends Man {
   
   
	@Override
	public void cut() {
   
   
		System.out.println("剪头发");
	}
}

现在创建一个对象

public class Duotaidemo01 {
   
   

	public static void main(String[] args) {
   
   
		Man m = new Doctor();
		m.cut();
		
		m = new Director();
		m.cut();
		
		m = new Hairdresser();
		m.cut();

	}
		//运行结果为
		动手术
		暂停
		剪头发

}

从一定角度来看,封装和继承几乎都是为多态而准备的。

2.多态访问成员的特点:

  • 成员变量: 编译时期看左边的类型,如果左边类型中没有变量,编译报错
    运行时期看左边类型,左边类型的变量的值就是运行的结果
    编译看左边,执行看左边
  • 成员方法:
    编译看左边,执行看右边
  • 构造方法:
    多态访问子类构造方法会先访问父类构造方法
    帮助子类初始化父类继承过来的成员
  • 静态方法:
    编译看左边,执行看左边
    看对象:Fu fu = new Zi();
class Fu {
   
   

	int num = 10;
	//父类成员方法
	public void method() {
   
   
		System.out.println("Fu.method()");
	}
	// 父类静态方法
	public static void show() {
   
   
		System.out.println("Fu.show");
	}
}

class Zi extends Fu {
   
   

	int num = 20;

	@Override
	//子类成员方法
	public void method() {
   
   
		System.out.println("Zi.method()");
	}
	// 子类静态方法
	public static void show() {
   
   
		System.out.println("Zi.show");
	}
	
}

创建一个子类对象 Zi

public class DuoTaiDemo02 {
   
   
	public static void main(String[] args) {
   
   
		Fu fu = new Zi();
		System.out.println(fu.num); // 10
		fu.method();//Zi.method()
		
		fu.show();//Fu.show
	}
}

3.多态的有点&例题

  • 多态的优点
    1.简化了代码
    2.提高了维护性和扩展性
    例子:需求: 饲养员给不同的动物喂不同的食物
    //开闭原则: 对扩展开放,对修改关闭
class Feeder{
   
   
	// 给老虎喂肉
//	public void feedMeatToTiger(Meat m, Tiger t) {
   
   
//		m.show();
//		t.show();
//	}
	
	// 熊猫喂竹子
### 回答1: 首先,我们需要定义一个宠物类,包含宠物的基本属性和方法,例如宠物的名字、年龄、种类等等,以及宠物玩耍方法。 然后,我们可以定义不同种类的宠物类,例如狗、猫、鸟等等,它们都继承自宠物类,并且可以重写宠物类中的玩耍方法,以实现不同种类宠物的特殊玩耍方式。 最后,我们可以定义一个主人类,主人可以领养不同种类的宠物,并且可以调用宠物类中的玩耍方法,实现宠物的互动。由于不同种类的宠物都继承自宠物类,因此我们可以使用多态的特性,让主人类的玩耍方法可以适用于不同种类的宠物,从而实现主人宠物的互动。 ### 回答2: 在Java中,我们可以通过使用多态实现主人领养宠物宠物玩耍。 首先,我们需要定义一个Pet(宠物)类,包含宠物的属性和行为。例如,宠物的属性可能包括名字、年龄、品种等,行为可能包括吃、睡觉、玩耍等。我们可以定义如下: ``` public abstract class Pet { private String name; private int age; private String breed; public Pet(String name, int age, String breed) { this.name = name; this.age = age; this.breed = breed; } public String getName() { return name; } public int getAge() { return age; } public String getBreed() { return breed; } public abstract void eat(); public abstract void sleep(); public abstract void play(); } ``` 接下来,我们可以定义各种具体的宠物类,例如狗、猫、鸟等,它们继承自Pet类并实现其中的抽象方法。例如,我们可以定义如下: ``` public class Dog extends Pet { public Dog(String name, int age, String breed) { super(name, age, breed); } public void eat() { System.out.println("狗狗正在吃东西"); } public void sleep() { System.out.println("狗狗正在睡觉"); } public void play() { System.out.println("狗狗正在玩耍"); } } public class Cat extends Pet { public Cat(String name, int age, String breed) { super(name, age, breed); } public void eat() { System.out.println("猫咪正在吃东西"); } public void sleep() { System.out.println("猫咪正在睡觉"); } public void play() { System.out.println("猫咪正在玩耍"); } } ``` 现在,我们可以定义主人类,主人可以领养宠物宠物玩耍。例如,我们可以定义如下: ``` public class Owner { public void adopt(Pet pet) { System.out.println("主人领养了一只" + pet.getBreed() + ",它叫做" + pet.getName() + ",今年" + pet.getAge() + "岁"); } public void playWithPet(Pet pet) { pet.play(); } } ``` 在主函数中,我们可以创建主人对象和宠物对象,并调用相应的方法。例如,我们可以定义如下: ``` public static void main(String[] args) { Owner owner = new Owner(); Pet dog = new Dog("小狗", 1, "哈士奇"); Pet cat = new Cat("小猫", 2, "波斯猫"); owner.adopt(dog); owner.playWithPet(dog); owner.adopt(cat); owner.playWithPet(cat); } ``` 运行程序后,输出结果如下: ``` 主人领养了一只哈士奇,它叫做小狗,今年1岁 狗狗正在玩耍 主人领养了一只波斯猫,它叫做小猫,今年2岁 猫咪正在玩耍 ``` 从结果可以看出,我们成功地使用多态实现主人领养宠物宠物玩耍功能。 ### 回答3: 多态是面向对象编程中的一个重要概念,它允许一个对象在不同的场景中以不同的形式呈现,即同一个方法可以在不同类的对象中有不同的实现。使用多态实现主人领养宠物宠物玩耍可以增加程序的灵活性,使代码更加简洁和易读。 首先,我们可以定义一个抽象类Pet,包含一些宠物的基本属性和行为,如宠物的名字、年龄、品种、颜色、喜好等等,以及玩耍的方法play()。 接下来,我们可以定义几个具体的宠物类,继承自Pet类,如猫、狗、鱼等,每个类都可以有自己特定的属性和行为。例如,猫和狗可以有不同的叫声、喜好、习惯,鱼可以有不同的游动方式、食性等。 然后,我们定义一个主人类,包含主人的名字和年龄等属性,以及领养宠物宠物玩耍的方法。在主人类中我们可以定义一个玩耍的方法,接受一个Pet类型的参数作为玩耍的对象,通过多态的方式,不同的宠物对象实现同一个play()方法,得到不同的行为结果。 最后,我们可以编写一个测试类,创建一个主人对象和若干个宠物对象,将主人领养宠物,然后使用玩耍的方法,主人可以宠物互动,例如玩球、摸头、喂食等等互动行为,从而增强主人宠物之间的情感联系。 总之,使用多态实现主人领养宠物宠物玩耍,能够使程序更加灵活高效,有助于代码的复用和维护。同时,它也体现了面向对象编程的核心思想:封装、继承和多态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值