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