Java 继承与多态

一、继承

在Java中,继承是一种重要的面向对象编程概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。这意味着子类可以使用父类的成员变量和方法,并且可以添加自己的新功能或覆盖父类的方法。

以下是关于Java中继承的一些重要概念:

  1. extends关键字: 在Java中,通过使用关键字extends来实现继承。例如:
    class SubClass extends SuperClass {// 子类的代码
    }
    
  2. 构造方法
    1. 父类构造方法:

      1. 父类构造方法用于初始化父类的实例变量。
      2. 如果子类没有显式地调用父类构造方法,Java会自动调用父类的无参构造方法(如果存在),以确保父类的初始化。
      3. 如果父类没有无参构造方法,而子类又没有显式地调用父类其他构造方法,则编译器会报错。
      4. 子类可以使用super关键字显式地调用父类的构造方法,以初始化父类的实例变量。
    2. 子类构造方法:

      1. 子类构造方法用于初始化子类的实例变量。
      2. 子类构造方法可以选择调用父类的构造方法,或者不调用。如果不调用父类构造方法,则会默认调用父类的无参构造方法。
      3. 子类构造方法可以重载父类的构造方法,但是在子类构造方法中调用父类构造方法的语句必须放在子类构造方法的第一行。
    3. 使用super关键字调用父类构造方法:

      • 子类可以使用super关键字显式地调用父类的构造方法。
      • 使用super()调用父类的无参构造方法。
    4. 使用super(...)调用父类的特定构造方法,传递参数给父类构造方法。
      class Parent {private int parentValue;public Parent() {this.parentValue = 0;System.out.println("Parent's default constructor");}public Parent(int value) {this.parentValue = value;System.out.println("Parent's constructor with parameter");}
      }class Child extends Parent {private int childValue;public Child() {super(); // 调用父类的无参构造方法this.childValue = 0;System.out.println("Child's default constructor");}public Child(int parentValue, int childValue) {super(parentValue); // 调用父类的有参构造方法this.childValue = childValue;System.out.println("Child's constructor with parameter");}
      }public class Main {public static void main(String[] args) {Child child1 = new Child(); // 默认调用父类的无参构造方法,然后调用子类的无参构造方法Child child2 = new Child(10, 20); // 调用父类的有参构造方法,然后调用子类的有参构造方法}
      }
      

      在上面的示例中,父类Parent有两个构造方法:一个是无参构造方法,另一个是带参数的构造方法。子类Child重写了这两个构造方法,并且在子类构造方法中使用super关键字来调用父类的构造方法。通过这样的方式,我们可以灵活地初始化父类和子类的实例变量

  3. 子类调用父类方法与属性

    在Java中,子类可以调用父类的方法和属性,以便在子类中重用父类的功能或访问父类的状态。这种调用通常通过super关键字来实现。
    1. 调用父类方法:
      • 子类可以使用super关键字调用父类的方法。
      • 通过super.methodName()来调用父类的方法。
      • 如果子类重写了父类的方法,使用super关键字可以在子类中调用父类的原始方法。
        class Parent {public void parentMethod() {System.out.println("Parent method");}
        }class Child extends Parent {public void childMethod() {super.parentMethod(); // 调用父类方法System.out.println("Child method");}
        }public class Main {public static void main(String[] args) {Child child = new Child();child.childMethod(); // 输出: Parent method\nChild method}
        }
        

        访问父类属性:

      • 子类可以通过super关键字访问父类的属性。
      • 使用super.fieldName来访问父类的属性。
        class Parent {public int parentValue = 10;
        }class Child extends Parent {public void printParentValue() {System.out.println("Parent value: " + super.parentValue); // 访问父类属性}
        }public class Main {public static void main(String[] args) {Child child = new Child();child.printParentValue(); // 输出: Parent value: 10}
        }
        

        在Java中,成员属性的空间是在对象被创建时开辟的,而对象的创建通常在构造方法被调用时完成。因此,在构造方法被调用之前,成员属性的空间已经被分配了。

        具体地说,当使用new关键字创建一个对象时,Java会为该对象分配内存空间,并在内存中创建对象的实例。在这个过程中,对象的成员属性的内存空间也会被分配,并根据其类型进行初始化(对于基本数据类型,会使用默认值;对于引用类型,会被初始化为null)。

        然后,构造方法会被调用,构造方法的主要任务是对对象进行初始化,这包括对成员属性的初始化、执行必要的设置操作等。

        所以,成员属性的空间开辟是在对象创建的过程中完成的,而构造方法通常是在这个过程中被调用的,因此在构造方法调用之前,成员属性的空间已经被分配了。

  4. 重写

    方法重写(Method Overriding)是面向对象编程中的一个重要概念,它允许子类重新定义父类中已经定义的方法。通过方法重写,子类可以根据自身的需求修改或扩展父类的方法,从而实现多态性。
    1. 方法重写的条件如下:

    2. 子类方法的名称、参数列表和返回类型必须与父类中被重写的方法完全相同。
    3. 子类方法不能缩小父类方法的访问权限。也就是说,如果父类方法是public,则子类方法也必须是public或者更宽松的访问权限。
    4. 子类方法不能抛出比父类方法更多的异常。
    5. 当子类重写父类的方法后,如果在子类的实例上调用该方法,则会执行子类中的方法,而不是父类中的方法。这种调用称为动态绑定或者后期绑定。这是Java中实现多态性的一种方式。

      下面是一个简单的例子来说明方法重写的概念:

      class Animal {public void makeSound() {System.out.println("Animal makes a sound");}
      }class Dog extends Animal {@Overridepublic void makeSound() { // 重写父类方法System.out.println("Dog barks");}
      }public class Main {public static void main(String[] args) {Animal animal = new Animal();animal.makeSound(); // 输出: Animal makes a soundDog dog = new Dog();dog.makeSound(); // 输出: Dog barks}
      }
      

      在上面的例子中,Animal类有一个makeSound方法,而Dog类继承了Animal类并重写了makeSound方法。当创建一个Animal对象并调用makeSound方法时,执行的是Animal类中的makeSound方法;而当创建一个Dog对象并调用makeSound方法时,执行的是Dog类中重写的makeSound方法。这显示了方法重写在Java中的实际应用,实现了多态性的概念。

二、多态

多态(Polymorphism)是面向对象编程中的一个重要概念,它使得代码更加灵活、可扩展和易于维护。多态性允许使用基类的引用变量来引用子类的对象,从而在运行时选择正确的方法执行。

多态的意义:

  1. 灵活性: 多态性允许使用统一的接口来操作不同的对象,从而使得代码更加灵活,可以适应不同类型的对象。

  2. 可扩展性: 当新增加一个子类时,不需要修改已有的代码,只需要保证新子类实现了相应的接口或继承了父类,就可以使用多态性来操作该子类对象。

  3. 易于维护: 多态性提高了代码的可读性和可维护性,因为不同的对象可以使用相同的接口来进行操作,降低了代码的复杂度。

实现条件:

  1. 继承: 多态性的实现依赖于继承关系,子类必须继承自父类或者实现相同的接口。

  2. 方法重写: 子类必须重写(Override)父类的方法,使得父类引用可以在运行时调用到子类的方法。

  3. 父类引用指向子类对象: 多态性的关键在于父类引用可以指向子类对象,即父类类型的引用变量可以引用子类类型的对象。

    // 父类
    class Animal {public void makeSound() {System.out.println("Animal makes a sound");}
    }// 子类
    class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Dog barks");}
    }public class Main {public static void main(String[] args) {Animal animal = new Dog(); // 父类引用指向子类对象animal.makeSound(); // 输出: Dog barks}
    }
    

    在上面的例子中,Animal是父类,Dog是子类,Dog类重写了Animal类的makeSound方法。在Main类中,创建了一个Animal类型的引用animal,并将其指向一个Dog类型的对象。然后调用animal.makeSound(),由于多态性的作用,实际上调用的是Dog类中重写的makeSound方法。这就是多态性的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/735163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法第二十六天-删除有序数组中的重复项Ⅱ

删除有序数组中的重复项 题目要求 解题思路 题目要求中提到原地修改,那么肯定需要一个指针指向当前即将放置元素的位置,需要另外一个指针向后遍历所有元素,所以[双指针]解法呼之欲出。 慢指针slow:指向当前元素放置的位置&…

F - Earn to Advance

解题思路 由于对于一点不知道后面得花费,所以无法决策当前是否要停下赚钱或要停下多久考虑一点,可以由其左上方的所有点到达所以从往前推,得出到的总花费然后考虑从之后不赚钱直接到最终所用次数和剩余钱若存在,在后面点赚钱更优…

Python错题集-8:AttributeError(找不到对应的对象的属性)

1问题描述 AttributeError: AxesSubplot object has no attribute arc 2代码详情 import matplotlib.pyplot as plt# 创建一个新的图形和坐标轴 fig, ax plt.subplots()# 定义弧线的参数 center (0.5, 0.5) # 圆心坐标 (x, y) width 1.0 # 半径 height 0.5 # 半径 ang…

沁恒CH32V307VCT6开发板记录---kalrry

沁恒CH32V307VCT6开发板记录---kalrry 一、官网申请开发板二、环境准备图一 一、官网申请开发板 1.沁恒官网 二、环境准备 1.数据手册:CH32V307DS0.PDF,CH32FV2x_V3xRM.PDF 2.CH32V307评估板说明及参考应用例程:CH32V307EVT_ZIP 3.集成开…

【kvm企业级虚拟化】之初级篇

目录 一、kvm介绍二、kvm软件安装三、GuestOS安装第一种方式:图形化安装第二种方式:命令行模式安装 四、GuestOS升级配置五、KVM存储六、磁盘格式七、创建磁盘文件八、KVM基本管理九、虚拟机克隆十、虚拟机快照十一、KVM网络管理1、kvm修改virbr0地址段&…

每日一面——封装、继承和多态

写前声明:参考链接 C面经、面试宝典 等 ✊✊✊每日一面——封装、继承和多态 一、简述一下什么是面向对象?二、讲一讲封装、继承、多态是什么?三、C的多态怎么实现?四、C中类成员的访问权限和继承权限问题五、C中的重载、重写&…

腾讯云拼了99元服务器老用户能买,续费不涨价!

良心腾讯云推出99元一年服务器,新用户和老用户均可以购买,续费不涨价,续费也是99元,配置为轻量2核2G4M、50GB SSD盘、300GB月流量、4M带宽:优惠价格99元一年,续费99元,官方活动页面 txybk.com/g…

C++类和对象(中篇)

目录 1. 类的6个默认成员函数 2. 构造函数 3.析构函数 4.拷贝构造函数 5.赋值运算符重载 6.const成员 7.取地址及const取地址操作符重载 1. 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是&#…

OpenMP

介绍 OpenMP 是一个应用程序接口 (API),由一组主要的计算机硬件和软件供应商共同定义。OpenMP 为共享内存并行应用程序的开发人员提供了一个可移植、可扩展的模型。该 API 支持各种架构上的 C/C 和 Fortran。 OpenMP是: 一个可…

基于动态内存设计的通讯录

test.c #define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h"void menu(){printf("\n");printf("1.增加联系人\n");printf("2.删除联系人\n");printf("3.查找联系人\n");printf("4.修改联系人\n");printf(&qu…

python学习笔记------字典

字典的定义 字典的定义,同样是使用{},不过存储的元素是一个个的键值对 基本语法: #定义字典字面量 {key:value,key:value,key:value,......key:value} #定义字典变量 my_dict{key:value,key:value,key:value,......key:value} #定义空…

elasticsearch篇:RestClient操作

1. RestClient ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。官方文档地址:Elasticsearch Clients | Elastic 其中的Java Rest Client又包括两种: Java Low Level Res…

Leetcode 3076. Shortest Uncommon Substring in an Array

Leetcode 3076. Shortest Uncommon Substring in an Array 1. 解题思路2. 代码实现 题目链接:3076. Shortest Uncommon Substring in an Array 1. 解题思路 这一题我的思路上很暴力,就是直接把所有可能的substring全部统计出来放到一起。 然后&#…

windows10+cpu+pycharm跑yolov5

1、安装anaconda和pycharm,安装方法参考: anaconda和pycharm安装(windows10 )-CSDN博客 2、创建yolov5环境,打开Anaconda Prompt命令打开cmd命令行窗口,如下所示: 输入:conda crea…

android pdf框架-6,文本生成pdf

前文介绍如何使用图片生成pdf,这里介绍如何使用文本生成pdf 使用mupdf生成 mupdf生成的pdf略大,字体可以自定义. 生成的代码不复杂,也有好几种,以story的方式生成为例 fun createPdfFromText(sourcePath: String, destPath: String): Boolean {val text EncodingDetect.rea…

【大模型】Hugging Face下载大模型的相关文件说明

Hugging Face下载大模型文件说明 1.前言 ​ 上图是毛毛张在HuggingFace的官网上的ChatGLM-6B大模型的所有文件,对于初学者来说,对于上面的文件是干什么的很多小伙伴是很迷糊的,根本不知道是干什么的,毛毛张接下来将简单讲述一下上面的每个文件的作用。 2.文件说明 在Hug…

FL Studio21最新官方完整免费版水果音乐制作软件下载

作为音乐制作软件专家,对于FL Studio21这款功能强大的音乐制作软件有着深入的了解,它为用户提供了从创作到后期制作的完整工作流程。以下是对其各项功能的全面、准确且详细的介绍: FL Studio 21 Win-安装包下载如下: https://wm.makeding.c…

vue项目部署服务器,因为跨域设置nginx.config要修改的配置

下面是我在vue项目中vite.config.js设置的配置代理 对于部署项目需要使用nginx进行vue项目的话,需要对nginx的配置文件进行如下修改即可

linux操作系统虚拟机的环境配置

目录 一、虚拟机安装(类似硬件的安装) (1)创建虚拟机 (2)创建虚拟机 二、IP和主机名称配置 1、设置VM上的IP 2、设置我们电脑上VMnet8的IP 3、设置虚拟机上的IP 主机名称映射 以下是设置主机名映射…

linux系统adb调试工具

adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb可以在Eclipse中通过DDMS来调试Android程序,说白了就是调试工具。 adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会…