文章目录

  • (一)编程实现
    • 1、创建动物类
    • 2、继承动物类,创建猫类
    • 3、继承动物类,创建狗类
    • 4、继承动物类,创建鸟类
    • 5、创建学生类
    • 6、创建测试学生类
    • 7、运行程序,查看结果
  • (二)知识点讲解
  • 动物类(Animal):属性(name、age)、方法(speak、move、eat)
  • 猫类(Cat)继承动物类,添加新方法(play)
  • 狗类(Dog)继承动物类,添加新方法(play)
  • 鸟类(Bird)继承动物类,添加新方法(play)
  • 学生类(Student):属性(name)、方法(feed(animal))

(一)编程实现

1、创建动物类

  • net.huawei.p03.t03包里创建Animal
public class Animal {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void speak() {System.out.println(name + "今年"  + age + "岁了。");}public void move() {System.out.println(name + "在动……");}public void eat() {System.out.println(name + "在吃……");}@Overridepublic String toString() {return "Animal{" +"name='" + name + '\'' +", age=" + age +'}';}
}

2、继承动物类,创建猫类

  • net.huawei.p03.t03包里创建Cat
public class Cat extends Animal {/*** 子类改写父类的同名同参方法(纵向多态)*/@Overridepublic void move() {System.out.println("猫咪[" + getName() + "]在走路。");}/*** 子类改写父类的同名同参方法(纵向多态)*/@Overridepublic void eat() {System.out.println("猫咪[" + getName() + "]爱吃鱼虾。");}/*** 子类添加新的方法*/public void play() {System.out.println("猫咪[" + getName() + "]在玩老鼠。");}
}

3、继承动物类,创建狗类

  • net.huawei.p03.t03包里创建Dog
public class Dog extends Animal {/*** 子类改写父类的同名同参方法(纵向多态)*/@Overridepublic void move() {System.out.println("狗崽[" + getName() + "]在蹦跳。");}/*** 子类改写父类的同名同参方法(纵向多态)*/@Overridepublic void eat() {System.out.println("狗崽[" + getName() + "]爱吃骨头。");}/*** 子类添加新的方法*/public void play() {System.out.println("狗崽[" + getName() + "]在玩飞盘。");}
}

4、继承动物类,创建鸟类

  • net.huawei.p03.t03包里创建Bird
public class Bird extends Animal {/*** 子类改写父类的同名同参方法(纵向多态)*/@Overridepublic void move() {System.out.println("鸟儿[" + getName() + "]在飞翔。");}/*** 子类改写父类的同名同参方法(纵向多态)*/@Overridepublic void eat() {System.out.println("鸟儿[" + getName() + "]爱吃小虫。");}/*** 子类添加新的方法*/public void play() {System.out.println("鸟儿[" + getName() + "]在玩羽毛。");}
}

5、创建学生类

  • net.huawei.p03.t03包里创建Student

  • 针对不同动物定义不同的喂养方法,这样就无法体现多态

  • 应该定义一个喂养方法,传入的是动物对象,而不是具体的猫对象、狗对象或鸟对象

  • Studen类的feed()方法,参数是Animal对象,可以指向狗、可以指向猫、也可以指向鸟,然后调用animal.move()animal.eat()时就会根据传入的不同动物而呈现不同的形态。Java提供了一个关键字instanceof,用来判断一个对象是否是某个类(或接口)的实例或者子类实例。

public class Student {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void feed(Animal animal) {if (animal instanceof Cat) { // 判断是否是猫实例System.out.println(name + "喂养猫咪[" + animal.getName() + "]。");            } else if (animal instanceof Dog) { // 判断是否是狗实例System.out.println(name + "喂养狗崽[" + animal.getName() + "]。");} else if (animal instanceof Bird) { // 判断是否是鸟实例System.out.println(name + "喂养鸟儿[" + animal.getName() + "]。");} else {System.out.println(name + "喂养动物[" + animal.getName() + "]。");}animal.speak(); // 子类继承了父类的方法animal.move(); // 体现多态(子类改写了父类的同名同参方法)animal.eat(); // 体现多态(子类改写了父类的同名同参方法)}
}

6、创建测试学生类

  • net.huawei.p03.t03包里创建TestStudent
public class TestStudent {public static void main(String[] args) {// 创建学生对象Student student = new Student();student.setName("张三丰");// 创建第一个动物Animal animal1 = new Cat();animal1.setName("虎丸");animal1.setAge(4);// 创建第二个动物Animal animal2 = new Dog();animal2.setName("瑞瑞");animal2.setAge(5);// 创建第三个动物Animal animal3 = new Bird();animal3.setName("豆豆");animal3.setAge(3);// 调用学生对象的喂养方法,传入不同的动物对象student.feed(animal1);student.feed(animal2);student.feed(animal3);        }
}

7、运行程序,查看结果

  • 运行TestStudent

  • 在第15行、第20行与第25行分别创建猫、狗与鸟对象,注意,指向的都是父类Animal变量animal1、animal2与animal3,传入学生对象的feed()方法,在feed()方法调用参数对象的move()与eat()方法时,程序在编译时自动识别具体的子类对象,从而选择性地调用对应的方法,这就是Java多态性的体现。由此可见,多态不仅解决了方法同名的问题,而且还使程序变得更加灵活,从而有效地提高程序的可扩展性和可维护性。

  • 美中不足之处:运行结果当中没有显示出各种动物的玩法

  • 修改Student类,直接添加一句animal.play(),但是要报错,怎么办呢?

  • 此时,我们要利用对象的向下转型(downcasting)

  • 再次运行测试学生类,查看结果

(二)知识点讲解

  • 定义: 在Java中,多态是指不同类的对象在调用同一个方法时所呈现出的多种不同行为。
  • 说明: 通常来说,在一个类中定义的属性和方法被其他类继承或重写后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现出的多种不同形态。
  • 作用: 通过多态,消除了类之间的耦合关系,大大提高了程序的可扩展性和可维护性。
  • 注意: Java的多态性是由类的继承、方法重写以及父类引用指向子类对象体现的。由于一个父类可以有多个子类,多个子类都可以重写父类方法,并且多个不同的子类对象也可以指向同一个父类。这样,程序只有在运行时程序才能知道具体代表的是哪个子类对象,这就体现了多态性。

【Java面向对象编程——喂养三种宠物】相关推荐

  1. JAVA面向对象编程——学生喂养三种宠物:猫、狗和鸟

    学生喂养三种宠物:猫.狗和鸟 编程代码 1.创建动物类 2.继承动物类,创建猫类 3.继承动物类,创建狗类 4.继承动物类,创建鸟类 5.创建学生类 6.创建测试学生类 7.查看运行结果

  2. java任务项目——学生喂养三种宠物:猫、狗、鸟

    文章目录 项目任务:学生喂养三种宠物:猫.狗.鸟 任务实施 1)创建动物类 2)继承动物类.创建猫类 3)继承动物类.创建狗类 4)继承动物类.创建鸟类 5)创建学生类 运行结果 面向对象编程 项目任 ...

  3. 任务三、学生喂养三种宠物:猫、狗和鸟

    文章目录 一.学生喂养三种宠物:猫.狗和鸟 (一)编程实现 1.创建动物类 2.继承动物类,创建猫类 3.继承动物类,创建狗类 4.继承动物类,创建鸟类 5.创建学生类 6.创建测试学生类 TestS ...

  4. 喂养三种宠物:猫、狗和鸟

    任务3.学生喂养三种宠物:猫.狗和鸟 动物类(Animal):属性(name.age).方法(speak.move.eat) 猫类(Cat)继承动物类,添加新方法(play) 狗类(Dog)继承动物类 ...

  5. 学生喂养三种宠物:猫、狗和鸟

    文章目录 学生喂养三种宠物:猫.狗和鸟 (一)编程实现 1.创建动物类 2.继承动物类,创建猫类 3.继承动物类,创建狗类 4.继承动物类,创建鸟类 5.创建学生类 6.创建测试学生类 7.运行程序, ...

  6. Java 面向对象编程(三)——多态,方法重写,向上转型,向下转型

    所谓多态,就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪 ...

  7. java范式_【java编程】三种非主流的编程范式?

    原标题:[java编程]三种非主流的编程范式? [Java培训]:的小编在一些平台上看到的高端的编程技巧,今天给大家介绍相应的三种编程范式,在编程中就提到了提到了不少小众语言,在这里小编希望借此让大家 ...

  8. Java面向对象编程篇2——面向对象三大特点

    Java面向对象编程篇2--面向对象三大特点 1.封装 1.1.封装的概念 通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值,无 论是编译阶段还是运行阶段都不会报错或者给出提示,此时与现实生 ...

  9. java面向对象编程知识点总结

    一:今天完成 上午详细了解了java面向对象编程的一些细节,记录如下. 1)类 是一种引用类型,包含一个签名和一个主体,主体是放在花括号里面的成员,成员包括字段和方法,还有构造方法.初始化程序和嵌套类 ...

最新文章

  1. namenode如何存储复本?
  2. Android Studio快捷键——编辑篇
  3. android自定义进度条渐变色View,不使用任何图片资源
  4. 给写新疆开放互联网一周纪念
  5. PCB-电解电容的封装
  6. 少儿编程100讲轻松学python(三)-python如何重命名文件
  7. p服务器不响应,无法加载资源:服务器响应状态为500
  8. python-多继承
  9. http://blog.chinaunix.net/uid-20577907-id-3519578.html
  10. 参考信息 - 云原生(Cloud Native)
  11. 安全应对MySQL攻击
  12. mysql不识别生僻字_MySQL生僻字插入失败怎么办
  13. 文件io(二)--unix环境高级编程笔记
  14. Ps 初学者教程,如何使用色阶滴管工具校正色偏?
  15. [2018.08.09 T3] 几何题
  16. FDDB人脸数据集dataset的dataset数据集的制作
  17. 电子元件-电感、磁珠
  18. Python 中的列表(一)
  19. Android TV真机测试
  20. java实现第39级台阶(三十九级台阶)

热门文章

  1. 洛谷 P1456 Monkey King 题解
  2. 十只老鼠和一千瓶毒药的故事。。。
  3. 【C++】游戏开发--基础
  4. [转载] 深入 superviser
  5. 玩 Spring框架
  6. 《工程伦理》网课第五章课后习题答案
  7. php日志写什么内容,Monolog-PHP日志类库介绍
  8. 判断一个链表是否为回文结构【Java实现】
  9. update from用法
  10. RDD:基于内存的集群计算容错抽象(转)