java_抽象类和接口
1.抽象类:
1.抽象类之所以被称为抽象类,就是因为它包含有抽象方法,只要含有抽象方法的类就叫抽象类。
2.抽象类中可以没有抽象方法,也可以抽象方法和非抽象方法共存。
3.抽象类和类一样是单继承的。
4.抽象类中可以存在普通的成员变量。
5.在Java中,我们通过abstract来定义抽象类:
// 这是一个抽象类
abstract class Animal{ }
2.接口:
1.接口中的方法在JDK8之前只能是抽象的,JDK8版本开始,接口中可以包含default方法。
2.接口可以实现多个父接口。
3.接口中的变量必须是static final类型,并被初始化。
4.通过interface关键字来定义接口:
// 这是一个接口
interface Bird{ }
5.default方法:
public interface MyInterface {
default void say(String message){
System.out.println("Hello "+message);
}
void test();
}
// 当一个类实现该接口时,可以继承到该接口中的默认方法,如下所示:
class MyClass implements MyInterface{
@Override
public void test() {
System.out.println("test...");
}
}
class Main{
public static void main(String[] args) {
MyClass client = new MyClass();
client.test();
client.say("World...");
}
}
// 如果两个接口中存在同样的默认方法,实现类继承的是哪一个呢?
public interface MyInterface {
default void say(String message){
System.out.println("Hello "+message);
}
void test();
}
interface MyInterface2{
default void say(String message){
System.out.println("[2]-Hello "+message);
}
}
// 此处会编译错误
class MyClass implements MyInterface, MyInterface2{
@Override
public void test() {
System.out.println("test...");
}
}
// 这个时候,实现类那里会编译错误,错误如下:
// 这个编译错误的大概意思就是说:有两个相同的方法,编译器不知道该如何选择了。
// 1.重写多个接口中的相同的默认方法
class MyClass implements MyInterface, MyInterface2{
@Override
public void say(String message) {
System.out.println("[Client]-Hello "+message);
}
@Override
public void test() {
System.out.println("test...");
}
}
// 2.在实现类中指定要使用哪个接口中的默认方法:
class MyClass implements MyInterface, MyInterface2{
// 手动指定哪个默认方法生效
public void say(String message) {
MyInterface.super.say(message);
}
@Override
public void test() {
System.out.println("test...");
}
}
6.为什么引入default方法:
答:使用接口,使得我们可以面向抽象编程,但是其中一个缺点就是当接口中有改动的时候,需要修改所有的实现类。
在JDK8中,为了给已经存在的接口增加新的方法并且不影响已有的实现,所以引入了接口中的默认方法实现。
默认方法允许在不打破现有继承体系的基础上改进接口,解决了接口的修改与现有的实现不兼容的问题。
注意:
该特性在官方库中的应用是:给java.util.Collection接口添加新方法,如stream()、parallelStream()、forEach()和removeIf()等等。
在我们实际开发中,接口的默认方法应该谨慎使用,因为在复杂的继承体系中,默认方法可能引起歧义和编译错误。
3.接口的作用:
接口最主要的作用是达到统一访问,就是在创建对象的时候用接口创建。
【接口名】 【对象名】= new 【实现接口的类】,这样你用哪个类的对象就可以new哪个对象了,不需要改原来的代码。
// 假如a,b两个类都实现了Interface Bird中的有fly()方法: Bird a = new A(); // 用a.fly() Bird b = new B(): // 用b.fly() // 这个就叫统一访问,因为你实现这个接口的类的方法名相同,但是实现内容不同。
4.再看接口的特点:
1.Java接口中的成员变量默认都是public static final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)。
2.Java接口中的方法默认都是public abstract类型的(都可省略),没有方法体,不能被实例化。
3.接口中没有构造方法,不能被实例化。
4.一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口。
5.Java接口必须通过类来实现它的抽象方法。
6.当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象类。
7.不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量的引用是实现了这个接口的类的实例。接口名 对象名 = new 实现接口的类()。
8.一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承。
5.接口和抽象类的使用场景:
当需要定义一些抽象方法而不需要其余额外的具体方法或者变量的时候, 我们可以使用接口。
反之,则需要使用抽象类,因为抽象类中可以有非抽象方法和变量。
java_抽象类和接口的更多相关文章
- java_抽象类、接口、多态的使用
抽象类 抽象类:包含抽象方法的类. 抽象方法 : 没有方法体的方法. 使用 abstract关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体. 格式为:修饰符 abstra ...
- 抽象类 VS 接口
引言 接口和抽象类是面向对象编程(OOP, Object Oriented programming)中两个绕不开的概念,二者相似而又有所不同.接下来,我们来了解二者的概念并比较它们的异同. 什么是抽象 ...
- java抽象类和接口
面向对象设计过程中重要的一点是如何进行抽象,即把"问题空间"中的元素与"方案空间"中的元素建立理想的一对一的映射关系.抽象类和接口便是抽象过程中的产物. ...
- php中抽象类与接口的概念以及区别
php里面的接口类,抽象类到底有什么用呢? 刚接触php的时候,觉得这个东西没什么用,其实这些东西还是有一定的作用的,下面我就简单的说说. 1.php 接口类:interface 其实他们的作用很简单 ...
- Java 抽象类与接口
接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是 Java 语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予 Java 强大的面向对象的能力.他们两者之间对 ...
- 浅谈我对C#中抽象类与接口的理解
C#中的抽象类与接口有些相似,初学者很容易混淆,今天就让我来谈谈对二者的理解. 首先我们得明确二者的含义,分述如下: 如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个 ...
- Atitit 深入理解抽象类与接口 attilax总结
Atitit 深入理解抽象类与接口 attilax总结 1.1. 主要区别接口侧重于动作抽象..抽象类是属性名词抽象..1 1.2. 抽象层次类>>抽象类>>接口1 1.3. ...
- luogg_java学习_07_抽象类_接口_多态学习总结
这篇博客总结了半天,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 , 抽象 一种专门用来做父类,被继承的. (模板) 格式: abs ...
- PHP中抽象类,接口定义
这里先介绍接口,因为在我最近看的好几本php工具书中都没有提到抽象类. 本人也觉得,在理解了接口后抽象类也非常好理解. 例子代码随便写了一下.例子代码是很ok的,测试过了不会报错,懒得看代码的筒靴们看 ...
随机推荐
- MySQL8.0降级安装5.7
本文旨在自我学习使用,如有任何疑问请及时联系博主 前言 基于OpenHarmony的FA数字管家服务端 默认情况下,Ubuntu20.04安装MySQL的版本为8.0.但8.0更加严格的加密规则,使得 ...
- 通信原理:基于MATLAB的AM调幅分析
目的: 通过matlab仿真AM调制,通过图像分析来更好的了解AM调制的过程 1.为什么基带信号要加上一个直流分量. 2.所加直流分量为什么要大于基带信号的最大值. 3.时域中调制信号与载波和基带信号 ...
- mysqkl修改存放位置 列的数据
1.表一旦创建后,列的数据是否可以修改?如果可以说明语法 update 表名称 set 列名='新内容' where 列名=某值 橙色代表条件列 2.修改存放数据的文件夹 先关闭mysql 把da ...
- Arch Linux 安装 Anbox
镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 Anbox 介绍 Anbox 是一个可以在 GNU/Linux 发行版上运行 Android App 的容器,是一个开源兼容层. 其工作原理是在 ...
- 解决metasploit的module load fail
解决metasploit的module load fail 在exploits文件夹下面新建一个文件夹test 把你要用的rb文件放进去 reload_all 就行了
- 半吊子菜鸟学Web开发3 --Html css学习1
1创建一个html文件,用vscode打开 首先输入一个! 然后就可以开始编辑html文件了 2 整体结构 <!DOCTYPE HTML><html> <head& ...
- LCS&&LRC&&LIS问题
注:最近笔试题经常碰到DP动态规划的问题,但是由于本人没有接触过DP,笔试后看到别人家的答案简洁又漂亮,真的羡慕:难的DP自己可能不会,那再见到常见的LCS和LRS以及LIS为问题总该会吧: 资料参考 ...
- 什么是基于Java的Spring注解配置? 给一些注解的例子?
基于Java的配置,允许你在少量的 Java注解 的帮助下,进行你的大部分Spring配置而非通过XML文件. 以@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被Sp ...
- kafka producer如何优化打入速度?
增加线程 提高 batch.size 增加更多 producer 实例 增加 partition 数 设置 acks=-1 时,如果延迟增大:可以增大 num.replica.fetchers(fol ...
- 什么是RabbitMQ?RabbitMQ的使用场景是什么?
参考链接:RabbitMQ 简介以及使用场景