首页 > 其他分享 >继承和多态2.0

继承和多态2.0

时间:2024-11-02 21:52:16浏览次数:5  
标签:重写 2.0 name 继承 子类 多态 父类 方法 public

1.1 多态定义

具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。

1.2 多态实现条件

1. 必须在继承体系下

2. 子类必须要对父类中方法进行重写

3. 通过父类的引用调用重写的方法

多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法

public class Animal {
    String name;
    int age;
    public Animal(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println(name + "吃饭");
    }
}
public class Cat extends Animal{
    public Cat(String name, int age){
        super(name, age);
    }
    @Override
    public void eat(){
        System.out.println(name+"吃鱼~~~");
    }
}
public class Dog extends Animal {
    public Dog(String name, int age){
        super(name, age);
    }
    @Override
    public void eat(){
        System.out.println(name+"吃骨头~~~");
    }
}
///分割线//
public class TestAnimal {
    // 编译器在编译代码时,并不知道要调用Dog 还是 Cat 中eat的方法
// 等程序运行起来后,形参a引用的具体对象确定后,才知道调用那个方法
// 注意:此处的形参类型必须时父类类型才可以
    public static void eat(Animal a){
      a.eat();
    }
    public static void main(String[] args) {
        Cat cat = new Cat("元宝",2);
        Dog dog = new Dog("小七", 1);
        eat(cat);
        eat(dog);
    }
}
运行结果:
        元宝吃鱼~~~
        元宝正在睡觉
        小七吃骨头~~~
        小七正在睡觉
在上述代码中 , 分割线上方的代码是 类的实现者 编写的 , 分割线下方的代码是 类的调用者 编写的 . 当类的调用者在编写 eat 这个方法的时候 , 参数类型为 Animal ( 父类 ), 此时在该方法内部并 不知道 , 也不关注当前的a 引用指向的是哪个类型 ( 哪个子类 ) 的实例 . 此时 a 这个引用调用 eat 方法可能会有多种不同的表现 ( 和 a 引用的实例相关 ), 这种行为就称为 多态 .

1.3 重写(override)

a 子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 参数列表   要完全一致 b  被重写的方法返回值类型可以不同,但是必须是具有父子关系的        //协变类型 c  访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被 public修饰,则子类中重写该方法就不能声明为 protected c  父类被  static private final   修饰的方法、构造方法都不能被重写。 d  重写的方法 , 可以使用 @Override 注解来显式指定 . 有了这个注解能帮我们进行一些合法性校验 . 例如不小心将方法名字拼写错了 ( 比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法 , 就会编译报错 , 提示无法构成重写 方法重载是一个类的多态性表现 , 而方法重写是子类与父类的一种多态性表现 对于已经投入使用的类,尽量不要进行修改。最好的方式是:重新定义一个新的类,来重复利用其中共性的内容,并且添加或者改动新的内容 静态绑定 :也称为前期绑定 ( 早绑定 ),即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代表函数重载。                         // 编译时绑定 动态绑定 :也称为后期绑定 ( 晚绑定 ),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法                  // 运行时绑定              //多态的基础
Animal animal = new Bird();               //  向上转型 animal.eat();              //  通过父类引用,调用这个父类和子类重写的方法

1.4 向上转移和向下转型

向上转型:实际就是创建一个子类对象,将其当成父类对象来使向上转型:用
父类类型 对象名 = new 子类类型 (); Animal bird = new Bird(); 1.直接赋值 Animal bird = new Bird(); 2.方法传参 Dog dog = new Dog(); func(dog);                      //func为父类中的方法 3.返回值 public static Animal func(){   return new Bird(); } 向上转型的优点:让代码实现更简单灵活。 向上转型的缺陷:不能调用到子类特有的方法。

向下转型:将父类引用再还原为子类对象

Animal animal = new Bird();

BIrd bird = (Bird) animal;

if(animal instanceof BIrd){

  //语句

}     instanceof 返回值为true/false

1. 属性没有多态性 当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性 2. 构造方法没有多态性

1.5 避免在构造方法中调用重写的方法

 

class B {
    public B() {
// do nothing
        func();
    }
    public void func() {
        System.out.println("B.func()");
    }
}
class D extends B {
    private int num = 1;
    @Override
    public void func() {
        System.out.println("D.func() " + num);
    }
}
public class Test {
    public static void main(String[] args) {
        D d = new D();
    }
}
// 执行结果
D.func() 0
构造 D 对象的同时 , 会调用 B 的构造方法 . B 的构造方法中调用了 func 方法 , 此时会触发动态绑定 , 会调用到 D 中的 func 此时 D 对象自身还没有构造 , 此时 num 处在未初始化的状态 , 值为 0. 如果具备多态性, num 的值应该是 1. 所以在构造函数内,尽量避免使用实例方法,除了 final 和 private 方法。 结论 : " 用尽量简单的方式使对象进入可工作状态 ", 尽量不要在构造器中调用方法 ( 如果这个方法被子类重写 , 就会触发动态绑定 , 但是此时子类对象还没构造完成 ), 可能会出现一些隐藏的但是又极难发现的问题

标签:重写,2.0,name,继承,子类,多态,父类,方法,public
From: https://blog.csdn.net/2301_80055001/article/details/143456362

相关文章

  • 继承和多态1.0
    1.1定义对共性的抽取,达到代码的复用.继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承主要......
  • Java 继承机制的笔记 1
    Java继承机制的笔记_1笔记的来源:CS61B-2024春季的课程课程主要内容:数据结构与算法分析课程运用语言:Java这个课有6个Homework,10个Lab,9个Project。其中第一个project是一个完整的2024游戏的实现,很有意思。此文章对应的是课程8-9节的内容。由于内容较多......
  • uniapp - 运行打包出现警告报错The legacy JS API is deprecated and will be removed
    问题描述在uniapp项目运行打包时警告提示ThelegacyJSAPIisdeprecatedandwillberemovedinDartSass2.0.0,另外还有可能存在其他sass错误或报错警告,uniapp正常运行项目也可能会提示此错误,无论是Hbuilder升级还是降级都不行(还有更坑的是就是升级完hbuilder才报的),详......
  • HDK Fileheader Download(2.0)
    HDKFileheaderLibraryDownload2.0Download1.13|1.13.1|1.13.2|1.13.3|1.13.4Download1.12|1.12.1|1.12.2Download1.11Download1.10|1.10.1Download1.9Download1.8|ForLinuxDownload1.7|1.7.1|1.7.2Download1.6Download1.5Downloa......
  • Ubuntu22.04安装HOJ流程
    一、docker安装1、更新Ubuntu打开终端,依次运行下列命令:sudoaptupdatesudoaptupgradesudoaptfull-upgrade2、添加Docker库首先,安装必要的证书并允许apt包管理器使用以下命令通过HTTPS使用存储库:sudoaptinstallapt-transport-httpsca-certificatescurlso......
  • 虚拟机扩容ubuntu22.04磁盘空间到逻辑卷中。
    在现有磁盘基础上直接扩容的。一开始部署的时候,设置的是40GB。现在已经使用30多GB了。需要扩容下。打开虚拟机设置把磁盘扩展到一定大小root@branch-dev:~#df-hFilesystemSizeUsedAvailUse%Mountedontmpfs3.2G2.2M......
  • CAN Specification 2.0 PART B -- CAN message 定义(1)
    记录BOSCHCANSpecification2.0PARTBCAN协议标准学习过程,以备需要时查看;BOSCHCANSpecification2.0 文档获取:http://esd.cs.ucr.edu/webres/can20.pdfCANmessage定义1.DATAFRAME数据帧DATAFRAME由StartofFrame,ArbitrationField,ControlField,Da......
  • 【Web前端】JavaScript 对象原型与继承机制
    JavaScript是一种动态类型的编程语言,其核心特性之一就是对象和原型链。理解原型及其工作机制对于掌握JavaScript的继承和对象关系非常重要。什么是原型每个对象都有一个内部属性 ​​[[Prototype]]​​​,这个属性指向创建该对象的构造函数的原型对象。这个内部属性通......
  • 什么是多态?面向对象中对多态的理解
    本文原文来自:什么是多态?面向对象中对多态的理解什么是多态多态(Polymorphism)是面向对象编程(OOP)中的一个核心概念,它允许对象以多种形式出现。多态性使得同一个接口可以用于不同的数据类型,从而使得代码更加灵活和可扩展。简单来说,多态就是一个接口,一个类,一个抽象类,一个类里面的方......
  • 猿人学web端爬虫攻防大赛赛题第17题——天杀的http2.0
    题目网址:https://match.yuanrenxue.cn/match/17解题步骤:老方法,看触发的数据包。只有一个数据包,再看cookie中有没有特殊的字段。没有遇到第13题的特殊字段,直接访问。importrequestsurl="https://match.yuanrenxue.cn/api/match/17?page=1"headers={"user-ag......