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

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

此篇用来记录自己学习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

### 封装 封装是面向对象编程的基本特性之一,其核心思想是将数据和行为绑定在一起,并对外部隐藏实现细节。通过使用访问修饰符(如 `private`、`protected` 和 `public`),可以控制类成员的可见性。封装提高了代码的安全性和可维护性,因为外部代码只能通过定义好的接口与对象交互,而无法直接访问或修改对象的内部状态[^3]。 例如,一个类可以将某些变量设为私有,并通过公共方法(getter 和 setter)来访问或修改这些变量: ```java public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` ### 继承 继承是面向对象编程中实现代码复用的重要机制。它允许一个类(子类)继承另一个类(父类)的属性和方法。通过继承,子类不仅可以复用父类的代码,还可以扩展或修改父类的行为。继承的语法如下: ```java public class Animal { public void speak() { System.out.println("Animal speaks"); } } public class Dog extends Animal { @Override public void speak() { System.out.println("Dog barks"); } } ``` 在上述代码中,`Dog` 类继承了 `Animal` 类,并重写了 `speak()` 方法以提供自己的实现。继承的好处包括代码重用、逻辑组织和扩展性。通过建立类之间的层次结构,代码变得更加清晰和易于维护[^3]。 在继承中,子类可以重写或隐藏父类的方法。重写是指子类提供与父类相同方法签名(方法名、参数列表和返回值类型)的方法,以改变方法的行为。隐藏是指子类定义与父类相同的静态方法,以覆盖父类的实现。`super` 关键字用于调用父类的方法或构造函数,而 `final` 关键字可以防止类被继承或方法被重写[^1]。 ### 多态 多态面向对象编程的核心特性之一,它允许不同类的对象对同一消息做出不同的响应。要实现多态,必须满足以下条件:必须在继承体系下,子类必须重写父类的方法,并且通过父类的引用调用子类重写的方法。多态的体现是在代码运行时,根据传递的对象类型,调用对应类中的方法[^2]。 例如: ```java public class Animal { public void speak() { System.out.println("Animal speaks"); } } public class Dog extends Animal { @Override public void speak() { System.out.println("Dog barks"); } } public class Cat extends Animal { @Override public void speak() { System.out.println("Cat meows"); } } public class Main { public static void main(String[] args) { Animal animal1 = new Dog(); Animal animal2 = new Cat(); animal1.speak(); // 输出 "Dog barks" animal2.speak(); // 输出 "Cat meows" } } ``` 在上述代码中,`animal1` 和 `animal2` 都是 `Animal` 类型的引用,但它们分别指向 `Dog` 和 `Cat` 对象。在运行时,根据实际对象的类型,调用对应类中的 `speak()` 方法。这种机制使得代码更加灵活,能够根据不同的对象执行不同的行为。 ### 相关问题 1. 封装在面向对象编程中的作用是什么? 2. 继承的语法和关键字有哪些? 3. 多态的实现条件和应用场景是什么? 4. 方法重写和方法重载的区别是什么? 5. 如何通过继承实现代码重用?
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值