java 多态与抽象类详解总结

目录
  • 前言
  • 多态
    • 初识多态
      • 什么是多态?
      • 多态的分类
      • 多态的必要条件
    • 实现多态
      • 向上转型
      • 向下转型
      • instanceof运算符
    • 具体实现
  • 抽象类与抽象方法
    • 为什么要使用抽象?
    • 抽象方法
    • 抽象类

前言

今天是2021LOL全球总决赛,一直不被大家看好的EDG冲到了决赛对战韩国队的DK,可以说EDG面对如此强大的对手,想赢是比较难的,为了给中国队打气我立下flag,如果EDG获胜那我就奖励自己学习到第二天6点,结果我就来了,,,恭喜EDG!

为了接下来接口的学习,我们先来学习多态与抽类相关的一些知识,有助于我们更好的学习接口这一重点

多态

初识多态

多态(Polymorphism)按字面的意思就是“多种状态”,是面向对象的程序设计语言最核心的特征。从一定角度来看,封装和继承几乎都是为多态而准备的。

什么是多态?

多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作,举个例子

彩色打印机和黑白打印机都是打印机,但是你用彩色打印机就可以打印出彩色的文件,用黑白打印机就可以打印出黑白的文件,使用不同的实例来执行不同的操作。

多态的分类

编译时多态(设计时多态):方法的重载
运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。这个也是我们平时所说的多态

一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法
调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定

多态的必要条件

继承
父类引用指向子类对象:Parent p = new Child();
重写

先来解释一下第三个:
方法的重写和重载是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。

实现多态

想要实现多态,那我们就先得了解向上转型与向下转型

向上转型

向上类型转换(Upcast):将子类型转换为父类型。 隐式/自动类型转换,是小类型到大类型的转换
对于向上的类型转换,不需要显示指定,即不需要加上前面的小括号和父 类类型名

例如:

Parent p = new Child();

就是非常典型的一种,前提是Parent是Child的父类,也就是父类引用指向子类实例化。这是自动进行的,是隐式的进行的。

向下转型

向下类型转换(Downcast):将父类型转换为子类型。 将一个指向子类对象的父类引用赋值给一个子类的引用
强制类型转换,是大类型到小类型 –
父类型的引用必须指向转型的子类的对象,即指向谁才能转换成谁。不然也会编译出错

例如:

Parent p = new Child();
Child c = (Child)p;

大家应该也注意到了,发生向下转型前发生了向下转型,这也是向下转型发生的前提,也就是将一个指向子类对象的父类引用赋值给一个子类的引用。

既然这样那么问题来了,我们怎么知道这个父类的引用是否指向了这个子类类型的对象呢?父类的子类一多,岂不是非常容易出错呢?

这个大家其实不需要太担心,因为我们有一个运算符instanceof

instanceof运算符

instanceof运算符用于:判断该运算符前面引用类型变量指向的对象是否是后面类,或者其子类、接口实现类创建的对象。如果是则返回true,否则返回false,

其使用格式如下: 引用类型变量 instanceof (类、抽象类或接口)

例如:

p instanceof Child;//true

instanceof运算符用于强制类型转换之前检查对象的真实类型以避免类型转换异常,从而提高代码健壮性。

具体实现

父类引用指向子类实例时,可以调用子类重写父类的方法以及直接继承父类的方法,无法调用子类特有的方法。
如果要调用子类的特有方法就得进行向下转型变成子类引用才可以。
静态static方法属于特殊情况,静态方法只能继承,不能重写。调用的时候用谁的引用,则调用谁的版本。

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

接下来来个简单的例子演示一下吧!

class Father {
    int age=35;
    public void high(){
        System.out.println("爸爸身高175cm");
    }
    public void hobby(){
        System.out.println("爸爸喜欢看新闻");
    }
    public static void sta(){
        System.out.println("我是父类的静态方法");
    }
}
class Son extends Father {
    public void high() {
        System.out.println("儿子今年身高180cm");
    }

    public void hobby() {
        System.out.println("儿子喜欢打英雄联盟");
    }
    public static void sta(){
        System.out.println("我是子类的静态方法");
    }
    public void self(){
        System.out.println("我是儿子的方法");
    }
}
public class Text_3 {
    public static void main(String[] args){
        Father f = new Son();
        f.hobby();
        f.high();
        f.sta();
//      f.self();//报错
        Son s = (Son) f;
        s.hobby();
        s.self();
        s.sta();
    }
}

输出为:

儿子喜欢打英雄联盟
儿子今年身高180cm
我是父类的静态方法
儿子喜欢打英雄联盟
我是儿子的方法
我是子类的静态方法

大家注意子类和父类中都有sta()方法,这并不是重写,它们都是自己类的方法,并无什么关系。

抽象类与抽象方法

为什么要使用抽象?

当父类的某些方法不确定时,可以用abstract关键字来修饰该方法,即:抽象方法,用abstract来修饰该类,即:抽象类。

我们都知道,父类是将子类所共同拥有的属性和方法进行抽取,这些属性和方法中,有的是已经明确实现了的,有的还无法确定,那么我们就可以将其定义成抽象,在后日子类进行重用,进行具体化。这样,抽象类也就诞生了。

用abstract修饰的类,即抽象类;用abstract修饰的方法,即抽象方法。

抽象方法

抽象方法不能有方法主体。格式如下:

//动物会叫
public abstract void cry();

抽象类

抽象类是为了把相同的但不确定的东西的提取出来,为了以后的重用。定义成抽象类的目的,就是为了在子类中实现抽象类。其实抽象类就是为了继承而出现的

abstract定义抽象类 ,抽象类可以没有抽象方法
抽象类不能直接实例化,只能被继承,可以通过向上转型完成对象实例
abstract定义抽象方法,不需要具体实现
包含抽象方法的类是抽象类
当继承的父类是抽象类时,需要将抽象类中的所有抽象方法全部实现。如果没有全部实现那么这个子类必须定义为抽象类,否则报错。
abstract 不能与static、final、private共存
抽象方法在子类实现时访问权限必须大于等于父类方法

格式如下:

abstract class Animal {
    String name;
    int age;

    // 抽象方法
    public abstract void cry();
}

希望大家能够像EDG一样证明自己,让那些看不好你的人,好好瞧瞧
加油,少年!

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

(0)

相关推荐

  • Java多态性抽象类与接口细致详解

    目录 1.多态性 1.1 向上转型 1.2 向下转型 2.抽象类 2.1 抽象类的基本概念 3.接口 3.1 接口的基本概念 3.2 接口的使用限制 3.3 使用接口定义标准 3.4 抽象类与接口的区别 1.多态性 多态性是面向对象的最后一个特征,它本身主要分为两个方面: ​ 方法的多态性:重载与覆写 ​ 1 重载:同一个方法名称,根据参数类型以及个数完成不同功能: ​ 2 覆写:通一个方法,根据操作的子类不同,所完成的功能也不同. ​ 对象的多态性:父子类对象的转换. ​ 1 向上转型:子类对

  • java 方法重写与权限修饰符以及多态和抽象类详解概念和用法

    1.方法重写 子类写和父类一样的方法定义 public void call(){ System.out.println("输出文字"); //父类的方法 } public void call(){ System.out.println("helloworld"); } //子类的方法 重写父类方法时,容易写错名字怎么办? 加个@Override 注解 如果报错,说明重写父类方法时,写错了 @Override: @Override public void call()

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

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

  • Java语法之 Java 的多态、抽象类和接口

    目录 一.多态 1. 向上转型 2. 动态绑定 3. 方法重写 4. 向下转型 5. 关键字 super 6. 在构造方法中调用重写方法(坑) 7. 理解多态 8. 小结 二.抽象类 1. 概念 2. 注意事项 3. 抽象类的意义 3. 抽象类的作用 三.接口 1. 语法规则 2. 实现多个接口 3. 接口的继承 4. Comparable 接口 4. Comparator 接口 5. Cloneable 接口和深拷贝 上一篇文章:Java 基础语法之解析 Java 的包和继承 今天这章主要介绍

  • Java面向对象基础之多态性,抽象类和接口

    一.多态性 多态是指一个对象可以拥有多种不同的形态,继承是实现多态的基础. 1.1 引用多态和方法多态 引用多态:父类引用可以指向本类的对象,也可以指向子类的对象 方法多态: 1.创建本类对象时,调用的方法为本类方法: 2.创建子类对象时,调用的方法为子类重写或继承的方法. 首先建立父类Animal,包含一个eat()方法,如下代码所示: public class Animal { public void eat(){ System.out.println("动物可以吃东西"); }

  • java 多态与抽象类详解总结

    目录 前言 多态 初识多态 什么是多态? 多态的分类 多态的必要条件 实现多态 向上转型 向下转型 instanceof运算符 具体实现 抽象类与抽象方法 为什么要使用抽象? 抽象方法 抽象类 前言 今天是2021LOL全球总决赛,一直不被大家看好的EDG冲到了决赛对战韩国队的DK,可以说EDG面对如此强大的对手,想赢是比较难的,为了给中国队打气我立下flag,如果EDG获胜那我就奖励自己学习到第二天6点,结果我就来了,,,恭喜EDG! 为了接下来接口的学习,我们先来学习多态与抽类相关的一些知识

  • Java 回调callback举例详解

    目录 前言 1.什么是回调 2.例子 第一章.故事的缘起 第二章.幼师的找茬 第三章.幼师回来了 第四章.门口的婆婆 前言 回调的核心就是回调方将本身即this传递给调用方,这样调用方就可以在调用完毕之后告诉回调方它想要知道的信息. 1.什么是回调 软件模块之间总是存在一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用. (1)同步调用: 同步调用是最基本并且最简单的一种调用方式,类A的方法a()调用类B的方法b(),一直等待b()方法执行完毕,a()方法再继续往下走.这种调

  • java 内部类的实例详解

    java 内部类的实例详解 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类. public class OuterClass { private String name ; private int age; public String getName() { return name; } p

  • Java Process类的详解及实例代码

    Java Process类的详解 前言: 今天用了下Java.lang.Process类,只是初步的学习,并没有深入实践,因为感觉它的用途并不是很大,偶尔才可能用上,如果要经常使用它的人可以自行参考JDk文档. 对Process类的简要说明: Process类是一个抽象类,方法都是抽象的,它封装了一个进程,也就是一个可执行的程序  该类提供进程的输入.执行输出到进程.等待进程的完成和检查进程的退出状态及销毁进程的方法 ProcessBuilder.start()和Runtime.exec方法创建

  • Java设计模式——工厂设计模式详解

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类. 工厂模式的形态 工厂模式主要用一下几种形态: 1:简单工厂(Simple Factory). 2:工厂方法(Factory Method). 3:抽象工厂(Abstract Factory). 简单工厂(Simple Factory) 又叫静态工厂,是工厂模式三中状态中结构最为简单的.主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例.我们来看一个具体的例子: 假设一家工厂,几生产洗衣

  • Java设计模式之装饰模式详解

    一.装饰模式引入例子 一个快餐店计算价格问题举例: 快餐店有炒面.炒饭这些快餐,可以额外附加鸡蛋.火腿.培根这些配菜,加配菜需要额外加钱,并且每个配菜的价钱不一样,计算快餐价格如何实现? 1.1 一般设计 1.2 使用继承方式的一般设计存在的问题 横向扩展性不好:如果要再加一种配料(火腿肠),我们就会发现需要给FriedRice和FriedNoodles分别定义一个子类.如果要新增一个快餐品类(炒河粉)的话,就需要定义更多的子,会出现类爆炸的问题. 继承适合于纵向扩展 二.装饰模式 2.1 装饰

  • Java AbstractMethodError原因案例详解

    背景 AbstractMethodError异常对于我来说还是比较不常遇见的,最近有幸遇到,并侥幸的解决了,在这里把此种场景剖析一番,进入正题,下面是AbstractMethodError在Java的异常机制中所处的位置: 现在明确了AbstractMethodError所具有的特性: 1.它是Error的子类,Error类及其子类都是被划分在非检查异常之列的,就是说这些异常不能在编译阶段被检查出来,只能在运行时才会触发. 2.通过API文档里面的解释大致得出的结论就是说A依赖于B,但是执行的时

  • Java AbstractMethodError案例分析详解

    背景 AbstractMethodError异常对于我来说还是比较不常遇见的,最近有幸遇到,并侥幸的解决了,在这里把此种场景剖析一番,进入正题,下面是AbstractMethodError在Java的异常机制中所处的位置: 现在明确了AbstractMethodError所具有的特性: 1.它是Error的子类,Error类及其子类都是被划分在非检查异常之列的,就是说这些异常不能在编译阶段被检查出来,只能在运行时才会触发. 2.通过API文档里面的解释大致得出的结论就是说A依赖于B,但是执行的时

  • Java Condition类案例详解

    一 condition 介绍及demo Condition是在java 1.5中才出现的,它用来替代传统的Object的wait().notify()实现线程间的协作,相比使用Object的wait().notify(),使用Condition的await().signal()这种方式实现线程间协作更加安全和高效.因此通常来说比较推荐使用Condition,阻塞队列实际上是使用了Condition来模拟线程间协作. Condition是个接口,基本的方法就是await()和signal()方法:

随机推荐