当前位置: 首页 > news >正文

Java基础——继承和多态

目录

一、继承

继承的定义:

继承的基本用法:

如何调用父类的方法?

二、多态

多态性的好处

多态中的强制类型转换:


 

包的命名规则——域名倒叙

一、继承

继承的定义:

        继承是面向对象编程中的一种机制,它允许一个类继承另一个类的属性和方法。通过这种方式,子类可以复用基类的代码,避免重复编写相同的代码。其中——父类又叫超类、基类。子类又叫派生类。

继承的基本用法:

在Java中,可以使用extends关键字来声明一个类继承另一个类:

在这个例子中,Dog类继承自Animal类,因此Dog类的对象可以使用Animal类中的eat方法,同时也可以调用Dog类自己定义的bark方法。

class Animal {void eat() {System.out.println("This animal eats food.");}
}class Dog extends Animal {void bark() {System.out.println("The dog barks.");}
}public class Main {public static void main(String[] args) {Dog myDog = new Dog();myDog.eat(); // 继承自父类 AnimalmyDog.bark(); // 子类 Dog 的方法}
}

注意!!!

继承有以下几个规则

  • 子类只能继承父类中可访问的属性和方法。如果父类中的某个方法或属性被声明为private,则子类无法直接访问它们。
  • 父类可以有很多个派生子类,但一个子类只能有一个父类。(区别于C++,能有多个父类)。
  • 父类的对象一定先于子类生成,先于子类被初始化
  • 被final修饰的类不可被继承,被final修饰的方法不可以被重写。

如何调用父类的方法?

        继承父类的无参和有参函数和引用封装的过程相同,就是默认调用同名中的无参函数,当传参数时,才会调用同名函数中有参的函数。

(如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。) 

  super关键字在Java等语言中用于引用当前对象的直接父类对象。通过使用super,你可以在子类的方法中调用父类的同名方法、访问父类的成员变量(如果它们不是私有的),或者调用父类的构造函数。

在上面的例子中,我们发现——当子类中的方法与父类中的方法重名时,这通常被称为方法覆盖(Override)。在这种情况下,子类的方法会隐藏(或说覆盖)父类中的同名方法。当你想在子类的方法中调用被覆盖的父类方法时,需要使用super关键字。重名方法只使用最新版。

二、多态

        多态是面向对象编程中的一个核心概念,它指的是一个对象变量可以指向多种实际类型的现象,即同一个事件发生在不同的对象上会产生不同的结果。

多态性的好处

  1. 提高了代码的复用性:通过多态性,可以使用父类类型的引用来操作子类对象,从而实现了代码的复用。
  2. 提高了代码的灵活性:多态性允许在运行时动态地确定对象的类型,从而可以根据需要调用不同的方法。这使得程序更加灵活和可扩展。
  3. 简化了代码:多态性允许使用统一的接口来操作不同的对象,从而简化了代码。

示例:

        x先被赋予父类Person后才被依次指向Child1,Child2,Child3,因此形成了一个多态。

我们会发现,同样都是执行x.m1()方法,因为作用在不同的对象上,结果不一样。

注意!!!

一个类的句柄可以指向自己类的对象或自己的子孙后代类的对象。反过来则不成立。

多态中的强制类型转换:

  1. 向上转型(Upcasting):将子类对象转换为父类对象。这是安全的,因为子类继承了父类的所有属性和方法。

    Animal myDog = new Dog(); // 向上转型,安全
    myDog.makeSound(); // 调用父类方法
  2. 向下转型(Downcasting):将父类对象转换为子类对象。这是不安全的,因为不是所有的父类对象都是子类对象。如果尝试将一个不是子类实例的父类对象转换为子类,会抛出ClassCastException

    Animal someAnimal = new Animal(); // 创建一个Animal对象
    Dog dog = (Dog) someAnimal; // 尝试向下转型,这里会抛出ClassCastException
  3. 同一个父类的多个派生类,不允许互相转换

    (Dog)s1=(Cat) s2 //不允许
    

http://www.lryc.cn/news/487302.html

相关文章:

  • 长江存储嵌入式面试题及参考答案
  • WordPress设置自动更新CSS版本号
  • 【Qt聊天室】客户端实现总结
  • 服务器数据恢复—raid5阵列故障导致上层系统分区无法识别的数据恢复案例
  • mysql bin log分析
  • 深入理解 Vue 3 中的 emit
  • #lwIP 的 Raw API 使用指南
  • Elasticsearch开启认证及kibana密码登陆
  • 【论文阅读】Large Language Models for Equivalent Mutant Detection: How Far Are We?
  • vue2 面试题带答案,万字总结
  • git的常用用法(最简精华版)
  • 哥德巴赫猜想渐行渐远
  • Spring Boot应用开发实战:构建高效、可维护的Web应用
  • keep-alive多级页面缓存实现
  • ks 小程序sig3
  • 图论之构造完全图
  • RDD触发算子:一些常用的触发算子(count、foreach、saveAsTextFile、first)
  • 搭建RAGFlow
  • css中的box-sizing,记录
  • 使用useCallback引发对闭包的理解
  • gvim添加至右键、永久修改配置、放大缩小快捷键、ctrl + c ctrl +v 直接复制粘贴、右键和还原以前版本(V)冲突
  • 腾讯云-COS
  • 蓝桥杯每日真题 - 第16天
  • 基因组之全局互作热图可视化
  • 基于Lora通讯加STM32空气质量检测WIFI通讯
  • STM32 极速入门第一天基础拓展 驱动i2c屏幕 ( 使用PlatformIO开发STM32单片机 )
  • 【WPF】Prism学习(五)
  • RabbitMQ的基本概念和入门
  • Shell脚本6 -- 条件判断if
  • 经验笔记:从生成 SSH 密钥到成功连接测试(以Gitee为例)