热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入理解多态及其在编程中的应用

本文探讨了多态的基本概念,包括其在现实世界和编程中的表现形式。多态不仅能够优化代码结构,减少重复代码,还能提高程序的灵活性和扩展性。文章通过具体的Java代码示例,展示了如何利用继承和方法重写来实现多态。

多态是面向对象编程中的一个重要概念,它允许一个接口或基类以多种形态出现,即不同的子类可以有不同的行为。这种机制有助于代码的优化,避免冗余,同时增加程序的灵活性。


在现实生活中,多态表现为同一事物在不同条件下产生不同的结果。例如,动物在遇到危险时,有的会逃跑,有的会攻击。而在编程中,多态则体现在通过相同的接口调用不同对象的方法,从而执行不同的操作。


实现多态的关键在于继承和方法重写。通过继承,子类可以从父类继承属性和方法,而方法重写则允许子类根据需要改变从父类继承来的方法的行为。


主人类示例


public class Owner {
// 为宠物治疗
public void treat(Pet pet) {
if (pet.getHealth() <50) {
pet.goToHospital();
}
}

// 给宠物喂食
public void feed(Pet pet) {
pet.eat();
}
}

宠物基类


public class Pet {
private String name = "Unnamed";
private int health = 100;
private int affection = 0;

public Pet() {
System.out.println("Base class no-arg constructor");
}

public Pet(String name) {
this.name = name;
}

public Pet(String name, int health, int affection) {
this.name = name;
setHealth(health);
setAffection(affection);
System.out.println("Base class parameterized constructor");
}

public void setHealth(int health) {
if (health <0 || health > 100) {
System.out.println("Please enter a value between 0 and 100!");
this.health = 60;
return;
}
this.health = health;
}

public int getHealth() {
return this.health;
}

public String getName() {
return this.name;
}

public void setName(String name) {
this.name = name;
}

public int getAffection() {
return this.affection;
}

public void setAffection(int affection) {
if (affection <0 || affection > 100) {
System.out.println("Please enter a value between 0 and 100!");
this.affection = 60;
return;
}
this.affection = affection;
}

public void displayInfo() {
System.out.println("Pet confession:\nMy name is " + this.name + ", health is " + this.health + ", and affection with the owner is " + this.affection + ".");
}

public void goToHospital() {}
}

宠物狗子类


public class Dog extends Pet {
private String breed = "Clever Labrador Retriever";

public Dog() {
System.out.println("Subclass Dog no-arg constructor");
}

public Dog(String name, int health, int affection) {
super(name, health, affection);
System.out.println("Subclass Dog parameterized constructor");
}

public Dog(String name, int health, int affection, String breed) {
this(name, health, affection);
this.breed = breed;
System.out.println("Subclass Dog four-parameter constructor");
}

public String getBreed() {
return this.breed;
}

public void setBreed(String breed) {
this.breed = breed;
}

@Override
public void displayInfo() {
super.displayInfo();
System.out.println(", I am a: " + this.breed);
}

@Override
public void goToHospital() {
System.out.println("Injection, take medicine");
setHealth(60);
}
}

宠物企鹅子类


public class Penguin extends Pet {
private String gender = "Q Baby";

public Penguin() {
System.out.println("Subclass Penguin no-arg constructor");
}

public Penguin(String name, int health, int affection, String gender) {
super(name, health, affection);
this.gender = gender;
System.out.println("Subclass Penguin parameterized constructor");
}

public String getGender() {
return this.gender;
}

public void setGender(String gender) {
this.gender = gender;
}

@Override
public void displayInfo() {
super.displayInfo();
System.out.println(", my gender is: " + this.gender);
}

@Override
public void goToHospital() {
System.out.println("Take medicine, rest");
setHealth(60);
}
}

宠物测试类


import java.util.Scanner;

public class TestPet {
public static void main(String[] args) {
Owner owner = new Owner();
Scanner scanner = new Scanner(System.in);
System.out.println("Welcome to the pet shop!");
System.out.println("Please enter the name of the pet you want to adopt:");
String name = scanner.next();
System.out.println("Please enter the type of pet you want to adopt: 1. Dog 2. Penguin");
int typeNo = scanner.nextInt();
switch (typeNo) {
case 1:
System.out.println("Please enter the pet's health value:");
int dHealth = scanner.nextInt();
System.out.println("Please enter the pet's affection with the owner:");
int dAffection = scanner.nextInt();
System.out.println("Please enter the pet's breed:");
String breed = scanner.next();
Pet dog = new Dog(name, dHealth, dAffection, breed);
dog.displayInfo();
System.out.println("*************************");
owner.treat(dog);
System.out.println("*************************");
dog.displayInfo();
break;
case 2:
System.out.println("Please choose the pet's gender: 1. Female 2. Male");
int genderId = scanner.nextInt();
String gender = (genderId == 1) ? "Female" : "Male";
System.out.println("Please enter the pet's health value:");
int pHealth = scanner.nextInt();
System.out.println("Please enter the pet's affection with the owner:");
int pAffection = scanner.nextInt();
Pet penguin = new Penguin(name, pHealth, pAffection, gender);
penguin.displayInfo();
System.out.println("*************************");
owner.treat(penguin);
System.out.println("*************************");
penguin.displayInfo();
break;
default:
System.out.println("We don't have that type of pet yet, please choose 1 or 2!");
break;
}
}
}

推荐阅读
  • Jenkins API当前未直接提供获取任务构建队列长度的功能,因此需要通过解析HTML页面来间接实现这一需求。 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
  • 深入理解云计算与大数据技术
    本文详细探讨了云计算与大数据技术的关键知识点,包括大数据处理平台、社会网络大数据、城市大数据、工业大数据、教育大数据、数据开放与共享的应用,以及搜索引擎与Web挖掘、推荐技术的研究及应用。文章还涵盖了云计算的基础概念、特点和服务类型分类。 ... [详细]
  • 本文介绍如何手动实现一个字符串连接函数,该函数不依赖于C语言的标准字符串处理函数,如strcpy或strcat。函数原型为void concatenate(char *dest, char *src),其主要作用是将源字符串src追加到目标字符串dest的末尾。 ... [详细]
  • 本文详细介绍了如何利用 Bootstrap Table 实现数据展示与操作,包括数据加载、表格配置及前后端交互等关键步骤。 ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
  • 本题要求计算一组正整数的最小公倍数(LCM)。输入包括多组测试数据,每组数据首先给出一个正整数n,随后是n个正整数。 ... [详细]
  • 深入理解ArrayList
    本文详细解析了ArrayList的工作原理及其性能特点,包括其内存分配机制和增删查改的操作效率。 ... [详细]
  • 高级缩放示例.就像谷歌地图一样.它仅缩放图块,但不缩放整个图像.因此,缩放的瓷砖占据了恒定的记忆,并且不会为大型缩放图像调整大小的图像.对于简化的缩放示例lookhere.在Win ... [详细]
  • Bootstrap Paginator 分页插件详解与应用
    本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ... [详细]
  • 本文档详细介绍了软通动力Java开发工程师职位的笔试题目,涵盖了Java基础、集合框架、JDBC、JSP等内容,并提供了详细的答案解析。 ... [详细]
  • java类名的作用_java下Class.forName的作用是什么,为什么要使用它?
    湖上湖返回与带有给定字符串名的类或接口相关联的Class对象。调用此方法等效于:Class.forName(className,true,currentLoader) ... [详细]
  • Logging all MySQL queries into the Slow Log
    MySQLoptionallylogsslowqueriesintotheSlowQueryLog–orjustSlowLog,asfriendscallit.However,Thereareseveralreasonstologallqueries.Thislistisnotexhaustive:Belowyoucanfindthevariablestochange,astheyshouldbewritteninth ... [详细]
  • 本文通过一个具体的实例,介绍如何利用TensorFlow框架来计算神经网络模型在多分类任务中的Top-K准确率。代码中包含了随机种子设置、模拟预测结果生成、真实标签生成以及准确率计算等步骤。 ... [详细]
author-avatar
gaoyong0713
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有