返回顶部
首页 > 资讯 > 后端开发 > Python >Java继承与多态的正确打开方式
  • 631
分享到

Java继承与多态的正确打开方式

2024-04-02 19:04:59 631人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录一.概述  二.继承2.1 继承的概述2.2 继承机制2.3 类中属性,方法的继承与覆盖1.属性的继承与覆盖2.方法的继承与覆盖2.4 super

一.概述  

面向对象程序设计的三大原则是封装性,继承性和多态性。继承性是子类自动共享父类的数据和方法的机制,它是由类的派生功能体现的。继承具有传递性,使得一个类可以继承另一个类的属性和方法,这样通过抽象出共同的属性和方法组件新的类,便于代码的重用。而多态是指不同类型的对象接收相同的消息时产生不同的行为,这里的消息主要是对类成员函数的调用,而不同的行为是指类成员函数的不同实现。当对象接收到发送给它的消息时,根据该对象所属的类,动态选用在该类中定义的实现算法

二.继承

2.1 继承的概述

在现实中存在很多如图所示的关系:

出租车,卡车和公交车都是汽车的一种,分别拥有相似的特征。例如,引擎的数量,外观颜色等。它们拥有相似的行为,如刹车和加速的功能。但是每种不同的交通工具又有自己的特征,如公交车拥有和其他交通工具不同的特性和行为——最大载客数量和到指定站点要报站的特点,而卡车的主要功能是送货物,也就是载货和卸货,因此拥有最大载重量的特性。

在面向对象的程序设计中该怎样描述现实世界的这种状况呢?这就用到继承的概念。

所谓继承,就是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。已有的类一般称为父类(基类或超类),这个过程也称为类的派生。由基类产生的新类称为派生类或子类,派生类同样可以作为基类再派生新的子类,这样就形成了类间的层次结构。

基类和派生类类的关系如下:

  • 基类是派生类的抽象(基类抽象了派生类的公共特征)。
  • 派生类是对基类的扩展。
  • 派生类和基类的关相当于“是一个(is a)”的关系,即派生类是基类的一个对象,而不是“有(has)”的关系,即类的对象包含一个或多个其他类的对象作为该类的属性。

2.2 继承机制

定义教师类,其中一类教师为Net教师,属性为姓名,所属部门,方法为授课,自我介绍。

public class NetTeacher {
   private String name;
   private String school;
   public NetTeacher(String myName,String mySchool){
      name = myName;
      school = mySchool;
   }
   public void giveLession(){
      System.out.println("启动 VS2021 ");
      System.out.println("知识点讲解");
      System.out.println("总结提问");
   }
   public void introduction(){
      System.out.println("大家好!我是" + schoool + "的" + name + " 。");
   }
}

定义教师类,其中一类教师为Java教师,属性为姓名,所属部门,方法为授课,自我介绍。

public class JavaTeacher {
   private String name;
   private String school;
   public JavaTeacher(String myName,String mySchool){
      name = myName;
      school = mySchool;
   }
   public void giveLession(){
      System.out.println("启动 idea2021 ");
      System.out.println("知识点讲解");
      System.out.println("总结提问");
   }
   public void introduction(){
      System.out.println("大家好!我是" + schoool + "的" + name + " 。");
   }
}

在程序处理中,发现两个类的定义非常相似,有很多相同点,如教师的属性姓名,所属部门类似,类的方法也基本相同。

针对这种情况,将Java教师类和Net教师类的共性抽取出来,形成父类Teacher类,使得Net教师和Java教师成为Teacher类的子类,则子类继承父类的基本属性和方法,就简化了子类的定义。上述代码可以修改如下:

public class Teacher {
   private String name;
   private String school;
   public Teacher(String myName,String mySchool){
      name = myName;
      school = mySchool;
   }
   public void giveLession(){
      System.out.println("知识点讲解");
      System.out.println("总结提问");
   }
   public void introduction(){
      System.out.println("大家好!我是" + schoool + "的" + name + " 。");
   }
}
 
子类JavaTeacher:
public class JavaTeacher extends Teacher {
   public JavaTeacher(String myName,String mySchool){
      super(myName,mySchool);
   }
   public void giveLession(){
      System.out.println("启动 IDEA2021 ");
      super.giveLession;
   }
 
子类NetTeacher:
public class NetTeacher extends Teacher {
   public NetTeacher(String myName,String mySchool){
      super(myName,mySchool);
   }
   public void giveLession(){
      System.out.println("启动 VS2021 ");
      super.giveLession;
   }

子类自动继承父类的属性和方法,子类中不再存在重复代码,从而实现代码的重用。

通过关键字 extends,分别创建父类 Teacher 的子类 JavaTeacher 和 NetTecher 。子类继承父类所有的成员变量和成员方法,但不能继承父类的构造方法。在子类的构造方法中,可使用语句super (参数列表)调用父类的构造方法,如子类构造方法中的语句 super(myName,mySchool)。

extends 说明要构建一个新类,该类从已存在的类派生而来。派生的定义过程,实际是经历了以下几个过程:

  • 子类继承父类中被声明为 public 和 protected 的成员变量和成员方法,但是不能继承被声明为 private 的成员变量和成员方法。
  • 重写父类成员,包括数据成员和成员函数。如果子类声明了一个与父类成员函数相同的成员函数,子类中的新成员则屏蔽了父类同名成员,类似函数中的局部变量屏蔽了全局变量,称为同名覆盖(Overriding)。
  • 定义新成员。新成员是派生类自己的新特性。派生类新成员的加入使得派生类在功能上有所发展。
  • 必须在派类中重写构造方法,因为构造方法不能继承。

2.3 类中属性,方法的继承与覆盖

1.属性的继承与覆盖

子类可以继承父类的所有非私有属性。

子类也可以覆盖继承的成员变量,对于子类可以从父类继承的成员变量,只要子类中定义的成员变量和父类中的成员变量同名,子类就覆盖了继承的成员变量。

当子类执行它自己定义的方法时,所操作的就是它自己定义的数据成员,,从而覆盖父类继承来的数据成员。

2.方法的继承与覆盖

父类中非私有( private )方法可以被子类所继承。

在子类继承父类的成员方法时,应注意一下两项:

  • 子类不能访问父类的 private 成员方法,但子类可以访问父类的 piblic ,protected 成员方法。
  • 访问 protected 时,子类和同一包内的方法都能访问父类的 protected 成员方法,但其他方法不能访问。

方法的覆盖是指子类中定义一个方法,并且这个方法的名字,返回类型,参数列表与父类继承的方法完全相同。

2.4 super 关键字

子类不能继承父类的构造方法。

如果基类中没有默认构造方法或希望调用带参数的基类构造方法,要使用关键字 super 来显示调用基类构造方法。使用关键字 super 调用基类构造方法的语句,必须是子类构造方法的第一个可执行语句。调用基类构造方法时,传递的参数不能是关键字 this 或当前对象的非静态成员。

super 关键字主要应用于继承关系实现子类对父类方法的调用,包括对父类构造方法和一般方法的调用。具体使用方法如下:

(1)子类的构造方法如果要引用 super ,必须把 super 放在构造方法的第一个可执行语句。例如:

public CommonEmployee (String name,double bonus){
   super (name);                         //通过 super () 的调用,给父类的数据成员赋初值
   this.bonus = bonus;                   // this 指当前对象
   System.out.println("子类构造方法的调用");
}

(2)在 Java 中,有时还会遇到子类中的成员变量或方法与父类中的成员变量或方法同名。同名子类中的成员变量或方法名优先级高,所以子类中的同名成员变量或方法覆盖了父类的成员变量或方法,但是我们如果想要使用父类中的这个成员变量或方法,就需要用到 super .

(3)可以用 super 直接传递参数。见下面代码:

public class Person {
    Person(){
        prt("A Person.");
    }
    Person(String name){
        prt("A person name is:" + name);
    }
    public static void prt(String s){
        System.out.println(s);
    }
}
 
public class Chinese extends Person {
    Chinese(){
        super();                     //调用父类无形参构造方法
        prt("A chinese");         //调用父类的方法prt
    }
    Chinese(String name){
        super(name);                 //调用父类具有相同形参的构造方法
        prt("his name is:" + name);
    }
    Chinese(String name,int age){
        this(name);                  //调用当前具有相同形参的构造方法
        prt("his age is:" + age);
    }
 
    public static void main(String[] args) {
        Chinese cn = new Chinese();
        cn = new Chinese("Kevin");
        cn = new Chinese("Jhone",21);
    }
}

 程序分析如下:

  • main()中首先构建Chinese的第一个对象cn, 语句cn = new Chinese()调用子类无参的构造方法Chinese(),在构造方法中super()语句调用父类的无参构造方法Person(),在父类无参的构造方法中调用父类的方法prt(),程序输出结果A Person,接下来返回子类的构造方法的调用处,继续执行下面的语句pr("A chinese."),则调用父类的方法prt输出结果A chinese.结束第一条语句。
  • 程序继续执行第二条语句cn = new Chinese("kevin");此时调用子类具有一 个参数参的构造方法Chinese(name),在构造方法中super(name)语句调用父类的有参构造方法prt("A person name is:"+ name),程序输出结果A person name is:kevin,接下来返回子类的构造方法的调用处,继续执行下面的语句prt("his name is:"+ name),则调用父类的方法prt输出结果his name is:kevin,结束第二条语句。
  • 接下来程序继续执行第三条语句cn = new Chinese("Jhone,"22);程序执行时先调用子类具有两个参数参的构造方法Chinese(name, age), 在构造方法中this ( name )语句则调用的是当前具有相同参数的构造方法,即调用子类具有一个参数参的构造方法Chinese(name),接下来调用父类的有参构造方法Person(name),为父类的name进行初始化,再接下来在父类有参的构造方法中调用父类的方法prt("A person name is:"+ name),程序输出结果A person name is: Jhone,接下来返回子类的构造方法的调用处,继续执行下面的语句prt("his name is:"+ name),则调用父类的方法prt输出结果his name is: Jhone,调用结束后程序返回子类构造方法Chinese(name,age)执行语句prt("his age is:"+ age); 输出结果his age is:22,结束第二条语句。

三. 多态

多态是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。

对面向对象来说,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性。

Java  实现多态有 3 个必要条件:继承、重写和向上转型。只有满足这 3 个条件,开发人员才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而执行不同的行为。

  • 继承:在多态中必须存在有继承关系的子类和父类。
  • 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
  • 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容! 

--结束END--

本文标题: Java继承与多态的正确打开方式

本文链接: https://lsjlt.com/news/161810.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java继承与多态的正确打开方式
    目录一.概述  二.继承2.1 继承的概述2.2 继承机制2.3 类中属性,方法的继承与覆盖1.属性的继承与覆盖2.方法的继承与覆盖2.4 super ...
    99+
    2024-04-02
  • Java初学之继承与多态
    目录在程序中声明包的语法:Java继承语法格式:什么是重写呢?:多态应用:引用变量的强制类型转换instanceof 运算符总结首先我们如果要使用Java中存在的包,可以程序中使用i...
    99+
    2024-04-02
  • Java继承与多态超详细梳理
    目录一、继承1、继承的概念2、继承的语法3、父类成员访问(1)子类中访问父类的成员变量(2)子类中访问父类的成员方法4、super关键字5、子类构造方法6、super和this7、代...
    99+
    2024-04-02
  • 如何正确的理解Java中的继承
    本篇文章为大家展示了如何正确的理解Java中的继承,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java作为一面向对象的语言,具备面向对象的三大特征——继承,多态,封装。继承顾名思义,继任,承接,传...
    99+
    2023-05-31
    java ava
  • 新手初学Java继承、封装与多态
    目录面向对象的三大核心特性封装继承单继承继承的优缺点super关键字super调用父类构造方法super访问父类成员super和this的区别多态instanceof关键字方法重载方...
    99+
    2024-04-02
  • java面向对象继承与多态介绍
    目录一.概述  二.继承2.1 继承的概述2.2 继承机制2.3 类中属性,方法的继承与覆盖2.4 super 关键字三. 多态总结一.概述 ...
    99+
    2024-04-02
  • 详解Java面向对象中的继承与多态
    详解Java面向对象中的继承与多态?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java 继承与多态的深入理解1、  什么是继承,继承的特点?子类继承父类的特征和...
    99+
    2023-05-31
    java 面向对象 ava
  • MySQL中MVCC的正确打开方式
     最近在学习MySQL中的MVCC,看了网上的各种版本,什么创建版本号、删除版本号,一开始看的时候,好像很对的样子,但实际上很多都是错误的。经过好几天的查阅对比,在几篇博客的帮助下,才算是觉得正确理解了MySQL中的MVCC。       ...
    99+
    2021-07-01
    MySQL中MVCC的正确打开方式
  • C++ 虚拟函数与继承:理解多态继承中的奥秘
    虚拟函数和继承在面向对象编程中实现多态性:声明虚拟函数允许派生类重写基类方法,并根据对象的运行时类型调用。继承建立类层次,派生类可访问和扩展基类数据和方法。多态继承允许派生类从多个基类继...
    99+
    2024-04-28
    c++ 多态
  • java语言之继承与多态的概念是什么
    在Java语言中,继承是一种对象-oriented编程的概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和...
    99+
    2023-10-11
    java
  • 【JAVA零基础入门系列】Day13 Java类的继承与多态
    继承是类的一个很重要的特性,什么?你连继承都不知道?你是想气死爸爸好继承爸爸的遗产吗?(滑稽)  开个玩笑,这里的继承跟我们现实生活的中继承还是有很大区别的,一个类可以继承另一个类,继承的内容包括属性跟方法,被继承的类被称为父类或者基类,继...
    99+
    2023-06-03
  • nodejs 子进程正确的打开方式
    因为库太拙了,需要在 nodejs 里调用子进程来获取数据。然而看到 child_process 的文档真是头疼,这么多种启动子进程的方法直接推到人面前,也没个解释,命名也十分无用。只能一个个地查看详细说明...
    99+
    2022-06-04
    进程 正确 方式
  • Java 继承的灵活性:多态的威力
    理解多态性 多态性基于两个概念: 子类化:子类可以继承父类的属性和方法,并添加自己的特定实现。 方法重写:子类可以覆盖从父类继承的方法,并提供自己的实现。 当一个父类引用指向其子类的对象时,就会发生多态性。此时,父类引用可以调用子类特...
    99+
    2024-03-12
    多态性是 Java 面向对象编程中一项关键特性 它允许对象表现出不同的行为 具体取决于它们的类型。通过多态性 我们可以创建通用代码 这些代码可以与不同类型的对象协同工作 从而提高代码的灵活性、可扩展
  • Python类的继承与多态详细介绍
    目录概念类的创建类的继承多态的使用概念 类(Class): 用来描述具有相同的属性和方法的对象的集合。 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类...
    99+
    2024-04-02
  • Python 继承与多态:从概念到应用,一网打尽
    什么是继承? 继承是面向对象编程中一个基础的概念,它允许一个类(子类)继承另一个类(父类)的特性。子类继承父类的属性和方法,并可以覆盖父类的方法以实现不同的行为。这有助于代码重用,减少重复代码并增强可扩展性。 继承的语法 在 Pytho...
    99+
    2024-02-19
    Python 继承 多态 代码重用 可扩展性
  • java设计模式—静态代理模式(聚合与继承方式对比)
    一、概述目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换思路:(1)聚合:代理类聚合了被代理类,且代理类及被代理类都实现了movable接口,则可实现灵活多变,具体看代码(...
    99+
    2023-05-31
    java 静态代理模式 设计模式
  • Java 多态中继承的转型详解与用法分析
    目录一、前言二、转型向上转型向下转型三、instanceof运算符instanceof的用处instanceof的使用格式:一、前言 前面我们学习了多态的概述和使用,现在我们来学习前...
    99+
    2024-04-02
  • java的三大特性封装、继承、多态
    我们知道面向对象的三大特性是封装、继承和多态。然而我们有时候总是搞不清楚这些概念。下面对这些概念进行整理,为以后面向抽象的编程打下坚实的基础。  封装的概念还是很容易理解的。如果你会定义类,那么相信你对封装的概念已经完全掌握了。下面定义的几...
    99+
    2017-04-24
    java教程 java 封装 继承 多态
  • Java中继承和多态的示例分析
    这篇文章给大家分享的是有关Java中继承和多态的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言首先我们如果要使用Java中存在的包,可以程序中使用import语句导入包。包说通俗点就是一个文件夹,为了...
    99+
    2023-06-20
  • 掌握 ASP 继承与多态:敲开编程天堂的大门
    继承是面向对象编程中的一项基本特性,它允许一个类继承另一个类的属性和方法。在 ASP.NET 中,继承用于创建新的类(子类),该类从另一个类(基类)继承功能。 继承的优点包括: 代码重用 维护简化 扩展性 ASP 多态 多态允许对象以...
    99+
    2024-03-12
    ASP 继承
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作