java面向对象继承与多态介绍

目录
  • 一.概述
  • 二.继承
    • 2.1 继承的概述
    • 2.2 继承机制
    • 2.3 类中属性,方法的继承与覆盖
    • 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 个条件,开发人员才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而执行不同的行为。

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

总结

到此这篇关于java面向对象继承与多态介绍的文章就介绍到这了,更多相关java继承与多态内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java初学之继承与多态

    目录 在程序中声明包的语法: Java继承语法格式: 什么是重写呢?: 多态应用: 引用变量的强制类型转换 instanceof 运算符 总结 首先我们如果要使用Java中存在的包,可以程序中使用import语句导入包.包说通俗点就是一个 文件夹,为了方便管理. 在程序中声明包的语法: package <包名> 注意:声明一个包的语句必须写在类中的第一行. 在程序中导入包的格式: import <包名>.<类名> 重点来了,继承! 继承是面向对象程序设计的一个重要特征,

  • java中的多态和继承示例分析

    本文实例讲述了java中的多态和继承.分享给大家供大家参考,具体如下: 我们知道"多态"和"继承"是分不开的哦!我们先写2个类! Car类 class Car { private String name; private double price; public Car(String name, double price) { super(); this.name = name; this.price = price; } public String getName

  • Java中的封装、继承和多态,你真的都懂了吗

    封装 所谓的封装就是把类的属性和方法使用private修饰,不允许类的调用者直接访问,我们定义如下一个类,可以看到所有的成员变量和成员方法都使用private修饰了,我们现在来使用一下这个类. 当我们使用的时候编译器给出了下面这样的报错. 告诉我们说是private访问控制,那么这是什么意思呢?我们来看看另外一张图,那么这张图代表这什么呢?在看这张图之前,我们先来看看四者都提到的包,那么包又是什么呢,包可以简单理解为一个文件夹,把类放到放到包里面,也就相当于是专门的文件夹里面,这不是我们说的重点

  • Java必须学会的类的继承与多态

    继承是类的一个很重要的特性,什么?你连继承都不知道?你是想气死爸爸好继承爸爸的遗产吗?(滑稽) 开个玩笑,这里的继承跟我们现实生活的中继承还是有很大区别的,一个类可以继承另一个类,继承的内容包括属性跟方法,被继承的类被称为父类或者基类,继承的类称为子类或者导出类,在子类中可以调用父类的方法和变量.在java中,只允许单继承,也就是说 一个类最多只能显示地继承于一个父类.但是一个类却可以被多个类继承,也就是说一个类可以拥有多个子类.这就相当于一个人不能有多个父亲一样(滑稽,老王表示不服). 话不多

  • java面向对象继承与多态介绍

    目录 一.概述 二.继承 2.1 继承的概述 2.2 继承机制 2.3 类中属性,方法的继承与覆盖 2.4 super 关键字 三. 多态 总结 一.概述 面向对象程序设计的三大原则是封装性,继承性和多态性.继承性是子类自动共享父类的数据和方法的机制,它是由类的派生功能体现的.继承具有传递性,使得一个类可以继承另一个类的属性和方法,这样通过抽象出共同的属性和方法组件新的类,便于代码的重用.而多态是指不同类型的对象接收相同的消息时产生不同的行为,这里的消息主要是对类成员函数的调用,而不同的行为是指

  • C++关于指针,继承和多态介绍

    目录 指针 指针和继承 指针.继承和多态 指针 我们在书本上学到的指针基本上都是:首先,指针是一个变量:其次,这个变量存储的值是一个地址.这个是对指针的一个基本理解,最近在编程中发现了一些新的东西. 首先,指针不仅仅是一个地址,还存在一个和所指向内容大小相关的值,如下代码: #include<iostream> using namespace std; int main() { int a = 10; int *pa = &a; cout << "pa: &quo

  • Java中继承、多态、重载和重写介绍

    什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承.多态.重载和重写. 继承(inheritance) 简单的说,继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(下面会讲到,这种方式叫重写)的方式,产生一个新的类型.继承是面向对象的三个基本特征--封装.继承.多态的其中之一,我们在使用JAVA时编写的每一个类都是在继承,因为在JAVA语言中,java.lang.Object类是所有类最根本的基类(或者叫父类.超类),如果

  • java 中继承和多态详细介绍

    继承和多态 一.this super关键字 1.this: 可以在构造器中的第一代码中调用本类中的其他构造器.this(参数) 非类方法参数中隐式传入的参数,表示调用当前方法的对象. 2.super: 可以在构造器的第一句代码调用父类的构造器.super(参数). 非静态方法中表示继承的父类对象,可以调用父类方法和属性. 二.方法的覆写: 子类重新实现了和父类一样的方法.访问修饰和异常都必须至少和父类的相同或者更大的范围. 三.方法的重载: 相同的方法的名字不同的参数列表. 四.多态: java

  • Java单例模式继承覆盖多态原理详解

    1.单例模式: 1)提出原因 是由gof 也就是四人组提出来的.为了保证jvm中某一类型的java对象永远只有一个,同时也是为了节省内存的开销.因为外面程序可以通过new的方法直接调用类里面的构造方法.导致该类的对象不止一个. 2)定义 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. A.构造方法私有化: B.对外提供一个公开的.静态的.获取当前类型对象的方法 C.提供一个当前类型的静态变量. 3)分类 A.饿汉式单例

  • java面向对象基础_final详细介绍

    final: 继承的弊端:打破了代码的封装性,final的出现正好弥补了这一弊端 final关键字: 1-final是一个修饰符,可以修饰类,方法,变量; 2-final修饰的类不能被继承 3-final修饰的方法不可以被覆盖 4-final修饰的变量是一个常数,只能被赋值一次并且要在定义时就将其赋予某值 规则: 被定义final的常量要用大写字母表示,各单词之间用下划线_来隔开. 实例一: class Father01{ final String FATHER01_NAME = "张三&quo

  • Java抽象类、继承及多态和适配器的实现代码

    Java继承 方法重写是Java语言多态的特性,必须满足以下条件 在子类中,方法名称与父类方法名称完全相同 方法的参数个数和类型完全相同,返回类型完全相同 方法的访问修饰符访问级别不低于父类同名方法的访问级别 在方法上添加@override注释,如果报错说明不是重写 方法重写限制 final修饰的父类方法在子类中不能被重写 static修饰的父类方法在子类中不能被重写,只能覆盖 super关键字 super关键字和this类似,super修饰的是父类的对象,如super();调用的是父类的默认无

  • Java面向对象编程(封装/继承/多态)实例解析

    本文主要介绍了面向对象的三大特征实例解析,下面看看具体内容. 封装 封装一个Teacher和Student类 package com.hz.test; public class Teacher { private String name; private String majorDirection; private String teachCourse; private int teachAge; public Teacher() { super(); } public Teacher(Stri

  • Java面向对象程序设计:继承,多态用法实例分析

    本文实例讲述了Java面向对象程序设计:继承,多态用法.分享给大家供大家参考,具体如下: 本文内容: 继承 多态 首发时期:2018-03-23 继承: 介绍: 如果多个类中存在相同的属性和行为,可以将这些内容抽取到单独一个类中,那么多个类(子类)无需再定义这些属性和行为,只要继承那个类(父类/超类/基类)即可.[比如,泰迪狗类也是狗类,狗的属性,泰迪狗也应该是有的,那么泰迪狗类在定义的时候就不必要添加那些与狗类重复的属性了,而是直接继承狗类即可.在多个狗类的子类(泰迪狗,二哈,柴犬)的时候,直

  • Java基础之面向对象机制(多态、继承)底层实现

    一.Java的前世 为什么会产生Java?Java的特点是什么? 从C语言开始讲,C语言是一种结构化语言,模块化编程,便于程序的调试,依靠非常全面的运算符和多样的数据类型,可以轻易完成各种数据结构的构建,通过指针类型更可对内存直接寻址以及对硬件进行直接操作,因此既能够用于开发系统程序,也可用于开发应用软件.其缺点就是封装性弱,程序的安全性上不是很好.C语言的异常处理一般使用setjmp()与longjmp(),在捕获到异常时进行跳转:或者使用abort()和exit()两个函数,强行终止程序的运

随机推荐