首页 > 编程语言 >面向对象编程系列3

面向对象编程系列3

时间:2024-10-13 12:50:27浏览次数:3  
标签:系列 面向对象编程 void public Animal Bird eat name

多态

理解多态之前,要先明白什么是向上转型和动态绑定。这个向上转型字面上的意思就是子类--->父类。我们在实例化一个鸟类时,可以这样写:

 Bird bird = new Bird("jj");

或者:

​
        Bird bird = new Bird("jj");
         Animal bird1 = bird;
         //两行代码组合起来
        Animal animal = new Bird("jj");

​
此时  animal  是一个父类 (Animal) 的引用 , 指向一个子类 (Bird) 的实例,这种写法就是向上转型。 我们看代码是从后往前看,相当于是把一个鸟类对象赋值给了父类对象,由子类到父类的转变,就是向上转型。 发生向上转型有三种形式,第一种就是上面演示的,直接赋值。还有两种分别是方法传参和方法返回。
public class Test { 
 public static void main(String[] args) { 
 Bird bird = new Bird("jj"); 
 feed(bird); 
 } 
 public static void feed(Animal animal) { 
 animal.eat("谷子"); 
 } 
} 

这是通过方法feed把bird传给animal,所谓方法传参。

public class Test { 
 public static void main(String[] args) { 
 Animal animal = findMyAnimal(); 
 } 
 public static Animal findMyAnimal() { 
 Bird bird = new Bird("圆圆"); 
 return bird; 
 } 
} 

这是通过findMyAnimal方法返回一个bird给animal,所谓方法返回。

下面说动态绑定。

package demo1;

public class Bird extends Animal{
    Bird(String name){
        super(name);
    }
    public void eat(){
        System.out.println("我调用的是Bird的eat方法!");
        System.out.println(name+"正在吃谷子!");
    }
}

class Animal{
    public String name ;
    public int age;
  public Animal(String name){
        this.name = name;//构造方法
  }
    public void eat(){
        System.out.println("我调用的是Animal的eat方法!");
        System.out.println(name+"正在吃饭!");
    }
    public  void run(){
        System.out.println(name+"正在跑!");
    }
}


public class Main {
    public static void main(String[] args) {


        Animal animal = new Animal("jj");
         animal.eat();
        Animal animal1 = new Bird("kk");
        animal1.eat();
   }

}





看以上代码,当父类和子类有同名的方法时,程序会调用哪个eat方法呢?这就要看调用方法的引用到底是指向父类对象还是子类对象。animal是指向父类Animal的引用,所以animal.eat()自然就调用父类Animal自己的eat方法,而animal1是指向子类Bird的引用,所以animal1调用的就是Bird的eat方法。在 Java 中, 调用某个类的方法, 究竟执行了哪段代码 (是父类方法的代码还是子类方法的代码) , 要看究竟这个引 用指向的是父类对象还是子类对象. 这个过程是程序运行时决定的(而不是编译期), 因此称为动态绑定。以上代码的运行将结果如下:

以上代码提到了父类和子类有相同的eat方法,这种子类实现父类的同名方法, 并且参数的类型和个数完全相同,叫做方法的重写。注意,重载和重写是有区别的。重载是有相同的方法名称,但是参数不同,这个不同可以是类型不同(add(int num1)  add(double num1)),个数不同(add()   add(int num1)    add(int num1,int num2)),顺序不同(add(int num1,double num2)  add(double num1,int num2)。方法的重载只跟方法名和形参列表有关,与修饰符,返回值类型无关。而重写是发生在父子类继承关系中的,方法名和参数列表必须完全一致,只是具体的实现不同。

理解了向上转型和动态绑定之以及方法的重写后,就可以去讲多态了。

​
package demo1;
class Animal{
    public String name ;
    public int age;
  public Animal(String name){
        this.name = name;//构造方法
  }
    public void eat(){
        System.out.println("我调用的是Animal的eat方法!");
        System.out.println(name+"正在吃饭!");
    }

}

class Dog extends Animal{
      public  Dog(String name){
        super(name);
    }
    public void eat(){
        System.out.println("我调用的是Dog的eat方法!");
        System.out.println(name+"正在吃狗粮!");
    }
}

class Cat extends  Animal{
    public  Cat(String name){
        super(name);
    }
    public void eat(){
        System.out.println("我调用的是Cat的eat方法!");
        System.out.println(name+"正在吃猫粮!");
    }
}

 class Bird extends Animal{
    Bird(String name){
        super(name);
    }
    public void eat(){
        System.out.println("我调用的是Bird的eat方法!");
        System.out.println(name+"正在吃谷子!");
    }
}





public class Main {
    public static void main(String[] args) {
      Animal animal1 = new Dog("小狗");
      Animal animal2 = new Cat("小猫");
      Animal animal3 = new Bird("小鸟");
      allEat(animal1);
      allEat(animal2);
      allEat(animal3);

   }
   public  static  void  allEat(Animal animal){
        animal.eat();
   }

}

​

看以上代码,我们只用了一个Animal的引用,却能表现出多种不同的形态(狗就是吃狗粮,猫就是吃猫粮,鸟就是吃谷子),这就是多态。发生多态的前置条件就是要先向上转型,在动态绑定(其中又涉及到了方法的重写),之后在发生多态。

使用多态的好处是什么呢?

封装是让类的调用者不需要知道类的实现细节 . 多态能让类的调用者连这个类的类型是什么都不必知道 , 只需要知道这个对象具有某个方法即可

因此 , 多态可以理解成是封装的更进一步 , 让类调用者对类的使用成本进一步降低。

标签:系列,面向对象编程,void,public,Animal,Bird,eat,name
From: https://blog.csdn.net/qq_74482991/article/details/142885959

相关文章

  • YOLOv11全网最新创新点改进系列:一文读懂YOLOv11算法!!!
    YOLOv11全网最新创新点改进系列:免费送!!!改进且跑通的源码!!融入CBAM注意力,将通道注意力和空间注意力相结合,嘎嘎提升V11算法,叫叫首,改进速度遥遥领先,粉丝水文速度遥遥领先!!!所有改进代码均经过实验测试跑通!截止发稿时YOLOv11已改进40+!自己排列组合2-4种后,考虑位置不同后可排列组合......
  • 自动驾驶之心系列课程
    网课学习的好处有哪些1、学生学习自主性强:当学生在面对电脑时,课程地址https://pan.baidu.com/s/1GIsMJ9BGgjgbJCrsVNDi6A?pwd=2q49会有一种自己未来掌握在自己手中的感觉,所有的操作完全由自己掌控,真正发挥学习的主观能动性。2、学生非限性学习:网络学习的学生不受年龄的限制,同......
  • (系列六).net8 全局异常捕获机制
    说明  该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。   该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。   说明:OverallAuth2.0是一个简单、易懂、功能强大的权限+可视化流程管理系统。友情提醒:本篇文章是属于系......
  • 【标准系列】国家标准平台
    前言标准是对重复性十五和概念所做的统一规定,它以科学技术和实践经验的结合成果为基础,经有关方面协商一致,由主管机构批准,以特定形式发布作为共同遵守的准则和依据。国家标准全文公开系统该系统收录现行有效强制性国家标准2049项。其中非采标1,451项可在线阅读和下载,采标598项......
  • 【标准系列】行业标准
    国家工程建设标准化信息网工程建设的国家标准(特别是强制性标准)及工程建设行业标准网址:http://www.ccsn.org.cn/中国电力企业联合会提供电力企业联合会的企业标准标准在线阅读及下载。网址:http://dls.cec.org.cn/zhongdianlianbiaozhun/商务部商务部流通标准制修订信息管理......
  • 拍立淘按图搜索商品列表接口系列,API接口开发
    拍立淘(Pailitao)是阿里巴巴旗下淘宝平台的一个功能,它允许用户通过上传图片来搜索相似的商品。然而,对于第三方开发者而言,直接访问淘宝的拍立淘接口进行API调用可能并不直接支持或需要特定的合作与授权。不过,我们可以探讨一种类似功能的实现方式,以及如何开发一个按图搜索商品列表......
  • 企业架构系列(19)TOGAF企业连续体和构建块
    TOGAF企业连续体(EnterpriseContinuum)是一个用于对架构描述进行分类的框架。它有助于突出架构师在哪个抽象层次上工作,并概述了不同目的下应使用的不同层次。而构建块(BuildingBlocks)是用来描述这些架构和解决方案工件的核心概念。TOGAF企业连续体的基本结构和其与架构和解......
  • 解密prompt系列40. LLM推理scaling Law
    OpenAI的O-1出现前,其实就有已经有大佬开始分析后面OpenAI的技术路线,其中一个方向就是从Pretrain-scaling,Post-Train-scaling向InferenceScaling的转变,这一章我们挑3篇inference-scaling相关的论文来聊聊,前两篇分别从聚合策略和搜索策略来优化广度推理,最后一篇全面的分析了各类广......
  • JVM系列1:深入分析Java虚拟机堆和栈及OutOfMemory异常产生原因
    JVM系列1:深入分析Java虚拟机堆和栈及OutOfMemory异常产生原因前言JVM系列文章如无特殊说明,一些特性均是基于HotSpot虚拟机和JDK1.8版本讲述。下面这张图我想对于每个学习Java的人来说再熟悉不过了,这就是整个JDK的关系图: 从上图我们可以看到,JavaVirtualMachine位于最底......
  • Gstreamer系列(2):gstreamer的视频编解码及不同平台编解码插件
    GStreamer是一个强大的多媒体框架,可以用于视频编码、解码和处理。视频编码的基础知识涉及到如何将原始视频数据转换为压缩格式以便于存储和传输。在GStreamer中,视频编码可以通过软编码(软件编码)和硬编码(硬件编码)两种方式实现。以下是GStreamer视频编码的基本概念,涵盖了这两......