JAVA基础之面向对象——为什么要使用多态?

文章讲述了学习JAVA时关于面向对象设计的实践,包括创建蛇怪和蜈蚣精的类,通过封装继承和方法重写。接着探讨了多态的概念,强调了多态在减少条件判断、简化代码和提高代码可扩展性上的作用,并通过宠物店喂养不同动物的例子进行了说明。

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

此篇用来记录自己学习JAVA时遇到的问题,希望能让将来再次迷茫的自己再次理解问题。

昨天在学习完封装继承、了解方法的重写后,其实已经可以完成类似于以下的题目:

某公司要开发新游戏,请用面向对象的思想,设计游戏中的蛇怪和蜈蚣精

设定

1) 蛇怪类:

属性包括:怪物名字,生命值,攻击力

方法包括:攻击,移动(曲线移动),补血(当生命值<10 时,可以补加 20 生命值)

2) 蜈蚣精类:

属性包括:怪物名字,生命值,攻击力

方法包括:攻击,移动(飞行移动)

要求

1) 分析蛇怪和蜈蚣精的公共成员,提取出父类—怪物类

2) 利用继承机制,实现蛇怪类和蜈蚣精类

3) 攻击方法,描述攻击状态。内容包括怪物名字,生命值,攻击力

4) 编写测试类,分别测试蛇怪和蜈蚣精的对象及相关方法

5) 定义名为 mon 的包存怪物类,蛇怪类,蜈蚣精类和测试类

运行效果

题目很简单,

①找出蛇怪和蜈蚣精的共同属性和共同方法写在父类里,按这些属性生成set和get方法以便子类调用。

②分别创建出蛇怪和蜈蚣精的子类,在子类的构造方法里使用set方法初始化子类对象的属性。

③在子类里重写“攻击”、“移动”等方法,以便展示出自己的特性。

④编写Test类,new出来蛇怪和蜈蚣精的对象,用 对象.方法 调用子类的方法。

————————————————我是分割线—————————————————

今天学习了多态,在听讲的时候就觉得很奇怪。明明继续用 对象.方法 就可以完成任务,为什么非要让子类向上转型,使用父类多态?因此一直抗拒吸收我一直在多态的概念。

好在经过思想漩涡的洗礼后,算是跳出了这桎梏。

多态的作用,就是不用你在执行的方法里写太多if else,并且后续新增子类,也不用再多写if。省写代码,利于测试、维护和扩展。

以宠物店为例,你知道猫要吃鱼,狗要吃骨头。(吃是一个方法)

但是当客户还没有送来宠物时,你不知道应该用什么样的方法来喂养送来的宠物!

这时就应该定义父类Ainamal去接收这一宠物类型(Dog、Cat、Rabbit...),完成向上转型。写一个带有Animal形参的方法test,方法体里写animal.eat。这样在调用“喂养”的方法时,直接test.keep(new xxx())就OK了!

//动物类代码
public class Animal {
    public void eat(){
        System.out.println("宠物正在吃东西...");
}
}
//狗狗类代码
public class Dog extends Animal {
    @Override
    public void eat(){
        System.out.println("狗狗正在吃骨头...");
    }
}
//猫猫类代码
public class Cat extends Animal {
    @Override
    public void eat(){
        System.out.println("猫猫正在吃鱼...");
    }
}
//测试类代码
public class Test{
public  void  keep(Animal animal){
    animal.eat();
}
    public  static void main(String[] args) {
    Animal cat = new Cat();
    Test test = new Test();
    test.keep(new Dog());//匿名对象,不用先new出来再用对象名调用,省一部分栈的空间
    }
}

扩展理解:其实多态的精髓就是向上转型向下转型

Dog向上转型成Animal时,会损失自己独特的属性。比如Animal里有a方法,Dog里有b方法,那么当Dog转为Animal类的对象时,b方法会不能被调用。

而如果想要让animal向下转型的话,则animal必须要是向上转型过来的,再向下转型到它本来的类。

例如:将Dog dog向上转型成Animal animal后,它才有资格向下转型,并且只能转成Dog。即:

Animal animal = Dog dog();
Dog dog = (dog) animal

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值