前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaSE进阶_03_接口&多态

JavaSE进阶_03_接口&多态

作者头像
全栈程序员站长
发布2022-10-04 13:08:26
3180
发布2022-10-04 13:08:26
举报

大家好,又见面了,我是你们的朋友全栈君。

今日内容

​ 接口 【重点】 ​多态 【重点】

接口 【重点】

代码语言:javascript
复制
什么是接口
当一个类中的所有的方法都是抽象方法的时候,这个类就可以定义成接口
接口其实是特殊的类,比抽象类更加抽象
接口是使用interface关键字定义的特殊的类
接口的好处
1、定义了规则:接口中的抽象方法可以认为是一种规则
2、利于扩展
接口的定义格式
public interface 接口名{}
接口的特点
1、接口不能实例化
2、类和接口的关系,是类实现(implements)接口
public class 类 implements 接口{}
3、类实现接口,要么实现其中所有抽象方法,要么该类也变成抽象类
4、一个类可以实现多个接口,多个之间使用逗号隔开
5、一个类在继承一个类的同时,还可以实现多个接口
public class Dog extends Animal implements InterA,InterB {
}
6、接口和接口之间的关系是继承,而且支持多继承(一个接口可以继承多个接口)
public interface InterA extends InterB,InterC{}
接口成员的特点
成员变量
变量:没有
常量:可以有
即使定义一个变量,其实默认也是常量,会有默认的修饰符:public static final修饰
构造方法
没有
成员方法
抽象方法:可以有
非抽象方法:不可以
JDK8和9版本前
抽象方法:使用abstract修饰的,没有方法体的方法
JDK8和9版接口的新特性
新特性是可以有非抽象方法的,但是必须是以下几种:
默认方法
静态方法
私有方法
默认方法
格式:
public default 返回值类型 方法名(参数列表){
方法体;
}
注意:public可以省略,但是写出来必须是public
default必须加上
默认方法只能定义在接口中,不要定义在类中
特点:
默认方法不是抽象方法,所以不强制被重写。但是可以被重写,重写的时候去掉default关键字
如果实现了多个接口,多个接口中存在相同的方法声明,子类就必须对该方法进行重写
静态方法
格式:
public static 返回值类型 方法名(参数列表){
方法体;
}
注意:public可以省略,但是写出来必须是public
static必须加上
特点:
静态方法只能通过接口名调用,不能通过实现类名或者对象名调用。
私有方法
格式:
private 返回值类型 方法名(参数列表){
方法体;
}
private static 返回值类型 方法名(参数列表){
方法体;
}
特点:
私有方法用于抽取接口的默认方法的共性内容
私有静态方法用于抽取接口的静态方法的共性内容
面试题:抽象类和接口的区别
1、定义的格式不同
抽象类:abstract class 修饰的类
接口: interface
2、成员不同
抽象类:
有构造方法
可以有变量和常量
可以有抽象方法,也可以有非抽象方法
接口:
没有构造方法
只能有常量不能有变量,常量是有默认修饰符public static final
只能有抽象方法,不能有非抽象方法(JDK8之前)
JDK8之后也可以有非抽象方法了,这些抽象方法只能默认的、静态的或者私有的
3、和类关系不同
抽象类是类,和类之间的关系是继承关系(extends),单继承,也可以多层继承,但是不能多继承

多态 【重点】

代码语言:javascript
复制
什么是多态
是一个对象表现出来的多种形式
多态是面向对象的三大特征之一
面试题:
横看成岭侧成峰,远近高低各不同
描述的是Java中的三大特征中的哪一种?
多态的前提
要有继承或实现关系
要有方法的重写
要有父类引用指向子类对象
多态下成员的访问特点
成员变量:编译看左边(父类),运行看左边(父类)
成员方法:编译看左边(父类),运行看右边(子类)
注意:
如果是静态的成员方法:编译看左边(父类),运行看左边(父类)
总结:编译都看左边,运行除了非静态的成员方法看右边之外,其他都看左边。
好处和弊端
好处
提高程序的扩展性。
定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
弊端
不能使用子类的特有成员
多态的转型
基础班学习过转型,基本类型之间的转换
就业班这里学习的转换,引用类型之间的转换
向上转型:类似于隐式转换(自动转换),将子类类型转换父类类型
Fu f = new Zi();
向下转型:类似于强制转换,将父类类型转换为子类类型
目标数据类型 对象名 = (目标数据类型)值;
Zi z = (Zi) f;
类型转换异常(ClassCastException)
出现的原因:
如果被转的引用类型变量,对应的实际类型和目标类型不是同一种类型,那么在转换的时候就会出现ClassCastException
解决方案
instanceof关键字/运算符进行判断
格式:
boolean 变量名 = 对象名 instanceof 类;
比如: a instanceof Dog
注意:instanceof左右两边的类型必须有子父类关系,如果是完全无关的两个类,那么编译都报错

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月6日 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 今日内容
  • 接口 【重点】
  • 多态 【重点】
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档