初识Java语言(六)- 多态、抽象类以及接口(1)

  • 通过父类的引用,调用子类中所重写的方法。

向下转型


自然,理解了向上转型,那么向下转型,就简单多了。向下转型,不是那么推荐使用,因为很容易出错。但是,对于我们初学,还是需要了解相关的概念的。

向下转型,自然而然,就是由父类对象,进行强制类型转换后,由子类类型所引用。我们先来看下面这一段代码:

Animal animal = new Animal(“黑黑”);

Cat cat = (Cat)animal; //强制类型转换为 子类

这段代码会编译出错吗?

答案肯定是会编译出错的(ClassCastException, 类型转换异常)。我们都能够理解,向下转型,是由父类对象 转换为 子类类型所引用,但是其实还有一个很重要的点,那就是这个父类对象,本质上,就是一个子类对象向上转型后得到的。如下代码:

Animal animal = new Cat(“喵喵”); //子类对象,向上转型

Cat cat = (Cat)animal; //向下转型

所以为了避免这种向下转型时,容易出错,所以还有一个关键字instanceof,专门用于检测,当前这个对象向下转型,是否会抛出异常,如果会抛出异常的话,instanceof返回的就是false,反之就是true。看如下代码:

Animal animal = new Cat(“喵喵”);

Cat cat = null;

if (animal instanceof Cat) { //animal这个对象,是由Cat类向上转型而来,就进入if语句

cat = (Cat)animal;

}

所以在强制类型转换时:

  • 只能在继承层次内进行强制类型转换。(也就说,被强制类型转换的对象,并不在当前的继承关系中,不能转换)

  • 在将父类强制转换为子类时, 应该使用instanceof进行检查。

深入理解多态


有了上面的向上和向下转型的基础,我们来以一段代码,理解多态这种思想,究竟有何好处?

image-20210912121049453

通过这样的方式,我们很轻松的就能都调用每个图形所对应的方法。如果我们不使用多态,我们就需要对传递进入draw方法的参数类型进行判断,判断是什么图形后,在才通过这个图形类进行方法的调用。大大的减少了代码量。

在上面代码中,Demo2中的代码,是类的调用者实现的,而像上面的Shape这些类,是由另外一个人实现的。调用者不需要知道,Shape类是怎么实现的,只需要知道怎么进行调用即可。此时Shape类进行调用draw方法,会根据传递过来的参数类型不同,从而调用不同的重写方法, 这就是多态。

那么使用多态的好处是什么?有以下几点:

  • 类调用者对类的使用成本降低

【封装让类的调用者不需要知道类的具体实现细节。多态能让类的调用者连这个类的类型是什么都不必知道,只需要这个类有这么一个方法即可】

  • 能够降低代码的“圈复杂度”, 也就是说,能减少大量的if-else语句

【圈复杂度:是一种描述一段代码的复杂程度的方式,一段代码如果平铺直叙,那么就很容易理解。而如果有很多的循环语句、选择语句等,就认为理解起来更复杂。 可以通过计算一段代码的循环、选择语句的个数,这个个数就称为“圈复杂度”。】

  • 可扩展能力更强。(比如:新添加一个图形,只需要这个类继承Shape,并重写方法即可)

面试题总结:重写(override)与重载(overload)的区别?


重载(overload)

​ 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。

​ 重载Overloading是一个类中多态性的一种表现。 Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。

​ 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。

​ 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。

重载规则

  • 必须具有不同的参数列表;

  • 可以有不同的返回类型,只要参数列表不同就可以了;

  • 可以有不同的访问修饰符;

  • 可以抛出不同的异常;

重写(override)

​ 父类方法被默认修饰时,只能在同一包中,被其子类重写,如果不在同一包则不能重写。

​ 父类的方法被protected时,不仅在同一包中,被其子类重写,还可以不同包的子类重写。

重写规则

  • 方法名、参数列表必须与父类方法的方法名和参数列表一致

  • 方法的返回值类型相同

  • 访问修饰限定符必须要大于或者等于父类方法的访问修饰限定符。并且父类方法不能是private修饰的,也不能是被final修饰的。

  • 父类和子类所重写的方法,都不能被static修饰。

  • 子类重写的方法,抛出的异常等级不能大于父类方法所抛出的异常

image-20210912153300024

二、抽象类

==============================================================

从普通类到抽象类


在上面的Shape类中,我们可以发现一个问题:Shaper的draw方法里面都没有写,只是在这里用来被重写的。有人可能就会问,怎么这么麻烦,有没有简单一点的写法。

那肯定是有的,抽象方法就能解决这个问题。

abstract class Shape {

public abstract void draw(); //被abstract修饰,这样就能省略花括号

}

注意:只要在一个类中,出现了抽象方法,那么这个类必须也是抽象的。也就是被abstract修饰。

当然在抽象类里,也是可以不全是抽象方法。如下

abstract class Shape {

public abstract void draw(); //被abstract修饰,这样就能省略花括号

public void display() {

System.out.println(“显示方法”);

}

}

抽象类的作用

抽象类存在的最大意义就是为了被继承。因为抽象类是不能自己进行实例化的。要想使用这个类,只能通过继承的方式,通过子类来进行重写这个方法里面所有的抽象方法。

抽象类的8个注意事项


  1. 包含抽象方法的类,称为抽象类。方法和类都是由abstract修饰的

  2. 抽象类中可以定义成员变量和成员方法(抽象与非抽象)

  3. 抽象类不能被实例化

  4. 抽象类存在的意义就是为了被继承

  5. 一个普通类继承了抽象类,那么普通类要重写抽象类中所有的抽象方法

  6. 抽象方法不能是被final修饰的, 也不能被private修饰。final和abstract不能共存。

  7. 一个抽象类A继承了另外一个抽象类B,此时有一个普通类C继承了抽象类A,那么此时普通类C需要重写A和B两个类的所有抽象方法。

  8. 如果一个普通类继承了抽象类,普通类又不重写父类的抽象方法,此时则可以将这个子类也变为抽象类。就不用重写父类的抽象方法。

三、接口

=============================================================

从类到接口


我们都知道在Java中,一个类只能继承一个父类,并不像C++那样能够实现多继承。有人就想啊,如果我继承了一个抽象类,那么就不能再继承其他类了,那该怎么办。

所以在Java中引入了接口的概念,接口是抽象类的升级版呢。

在上文中的我们将Shape写成一个类,可以实现多态,那么我们实现成接口,该怎么实现呢?如下:

interface IShape {

public abstract void draw(); //接口里,默认的就是被 public abstract修饰

}

class Rect implements IShape {

@Override

public void draw() {

System.out.println(“画一个矩形”); //重写接口里面的所有抽象方法

}

}

这样,我们就实现了一个接口;

  • 接口是由interface修饰的,而不是class

  • 接口不能单独被实例化

  • 接口中的方法默认是被public abstract修饰的

  • 接口中的变量默认是被public static final 修饰的

  • 让类与接口连接起来,术语叫:实现接口。使用implements关键字,写在类名的末尾,后面写接口名

  • 若这个类还继承了父类,那么接口应写在父类名的后面,如下:

class Student extends Person implements Ishape {

}

尤其切记:接口中的方法,默认是被public abstract修饰的,有如下错误的代码

interface IShape {

abstract void draw(); //接口里,默认的就是被 public abstract修饰

}

class Cycle implements IShape {

void draw() { //访问权限并没有与接口中的方法相等或大于。即就是这里必须写public

System.out.println(“画一个圆”);

}

}

提示:

1、 我们创建接口时,接口的命名一般以大写字母I开头

2、 接口的命名一般使用“形容词”词性的单词

3、 阿里编码规范,接口中的方法和成员变量不要加任何的修饰符,保持代码的简洁性

实现多个接口


在Java中无法实现多继承,所以我们只能通过实现多个接口,来达到类似于多继承的情况。那么该如何实现多个接口呢?我们以一个例如来说:

//青蛙,既能在陆上跳,也能在水里游

interface ISwimming {

void swimming(); //默认是被public abstract 修饰的

}

interface IJump {

void jump();

}

class Frog implements IJump, ISwimming {

public String name;

//重写接口里面的所有方法

public void swimming() {

System.out.println(“游泳”);

}

public void jump() {

System.out.println(“跳跃”);

}

}

这样,我们就能让Frog类实现两个接口,解锁两个技能(跳跃和游泳)。这就是实现多个接口。

接口与接口之间的扩展


当然,接口与接口之间,也还是可以用extends来实现扩展

interface ISwimming {

void swimming(); //默认是被public abstract 修饰的

}

interface IJump {

void jump();

}

//通过extends,实现接口之间的扩展

interface IAmphibious extends IJump, ISwimming {

}

如上代码,我们就将上面两个接口,结合在了一个接口里,新的接口里,还可以重新添加其他的方法。这样的话,就将很多功能的接口,结合了在一起,此时青蛙类再去实现IAmphibious接口,就能拥有接口里的所有方法。

接口的8个注意事项

最后

小编在这里分享些我自己平时的学习资料,由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

开源分享:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】

程序员代码面试指南 IT名企算法与数据结构题目最优解

这是” 本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一-痛点, 本书选取将近200道真实出现过的经典代码面试题,帮助广“大程序员的面试准备做到万无一失。 “刷”完本书后,你就是“题王”!

image.png

《TCP-IP协议组(第4版)》

本书是介绍TCP/IP协议族的经典图书的最新版本。本书自第1版出版以来,就广受读者欢迎。

本书最新版进行」护元,以体境计算机网络技不的最新发展,全书古有七大部分共30草和7个附录:第一部分介绍一些基本概念和基础底层技术:第二部分介绍网络层协议:第三部分介绍运输层协议;第四部分介绍应用层协议:第五部分介绍下一代协议,即IPv6协议:第六部分介绍网络安全问题:第七部分给出了7个附录。

image.png

Java开发手册(嵩山版)

这个不用多说了,阿里的开发手册,每次更新我都会看,这是8月初最新更新的**(嵩山版)**

image.png

MySQL 8从入门到精通

本书主要内容包括MySQL的安装与配置、数据库的创建、数据表的创建、数据类型和运算符、MySQL 函数、查询数据、数据表的操作(插入、更新与删除数据)、索引、存储过程和函数、视图、触发器、用户管理、数据备份与还原、MySQL 日志、性能优化、MySQL Repl ication、MySQL Workbench、 MySQL Utilities、 MySQL Proxy、PHP操作MySQL数据库和PDO数据库抽象类库等。最后通过3个综合案例的数据库设计,进步讲述 MySQL在实际工作中的应用。

image.png

Spring5高级编程(第5版)

本书涵盖Spring 5的所有内容,如果想要充分利用这一领先的企业级 Java应用程序开发框架的强大功能,本书是最全面的Spring参考和实用指南。

本书第5版涵盖核心的Spring及其与其他领先的Java技术(比如Hibemate JPA 2.Tls、Thymeleaf和WebSocket)的集成。本书的重点是介绍如何使用Java配置类、lambda 表达式、Spring Boot以及反应式编程。同时,将与企业级应用程序开发人员分享一些见解和实际经验,包括远程处理、事务、Web 和表示层,等等。

image.png

JAVA核心知识点+1000道 互联网Java工程师面试题

image.png

image.png

企业IT架构转型之道 阿里巴巴中台战略思想与架构实战

本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。

image.png

用。

[外链图片转存中…(img-0glFXBVS-1714631350401)]

Spring5高级编程(第5版)

本书涵盖Spring 5的所有内容,如果想要充分利用这一领先的企业级 Java应用程序开发框架的强大功能,本书是最全面的Spring参考和实用指南。

本书第5版涵盖核心的Spring及其与其他领先的Java技术(比如Hibemate JPA 2.Tls、Thymeleaf和WebSocket)的集成。本书的重点是介绍如何使用Java配置类、lambda 表达式、Spring Boot以及反应式编程。同时,将与企业级应用程序开发人员分享一些见解和实际经验,包括远程处理、事务、Web 和表示层,等等。

[外链图片转存中…(img-3TYteOZa-1714631350402)]

JAVA核心知识点+1000道 互联网Java工程师面试题

[外链图片转存中…(img-iVr5dSAJ-1714631350402)]

[外链图片转存中…(img-5DX9EjbF-1714631350402)]

企业IT架构转型之道 阿里巴巴中台战略思想与架构实战

本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。

[外链图片转存中…(img-JwajZQ96-1714631350403)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值