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的,测试过了不会报错,懒得看代码的筒靴们看 ...
随机推荐
- [C++] C++socket套接字网络通讯实例
//服务器端:#include "winsock2.h" #include <string>#pragma comment(lib, "ws2_32.lib ...
- 使用.Net6中的System.Text.Json遇到几个常见问题及解决方案
前言 以前.NetCore是不内置JSON库的,所以大家都用Newtonsoft的JSON库,而且也确实挺好用的,不过既然官方出了标准库,那更方便更值得我们多用用,至少不用每次都nuget安装Newt ...
- 网络编程 并发socketserver
网络编程 并发socketserver ipv4.ipv6 ip协议:规定网络地址的协议 B/S架构 C/S架构 bs是cs的一种 B/S是浏览器和服务端架构 C/S是客户端和服务端架构 osi七层协 ...
- 实现一个cache
实现一个LRU cache,定义get函数和set函数,cache是固定长度的,当cache已经满,那么就删除一直没有被更新的记录,然后将新的记录放进去. LRU: 全称是Least Recently ...
- 如何使用docker制作开发集成环境
1. 编写最基本的Dockerfile 内容:touch 一个Dockerfile FROM ubuntu 2. 创建基本的docker镜像 docker build -t ubuntu:v1 . ...
- 数据结构 - 顺序表 C++ 实现
顺序表 此处实现的顺序表为**第一个位置为 data[0] **的顺序表 顺序表的定义为 const int MAX = 50; typedef int ElemType; typedef struc ...
- spring cloud 断路器的作用是什么?
在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待.这样就不会使得线程因 ...
- MySQL 面试题MySQL 中有哪几种锁?
1.表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最 高,并发度最低. 2.行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最 低,并发度也最高. 3.页面锁:开 ...
- vue Cannot read property ‘tapPromise‘ of undefined
https://blog.csdn.net/qq379682421/article/details/111574290 https://github.com/SimenB/add-asset-html ...
- struts2学习一:hello struts2及struts2环境配置中遇到的问题
17年下半年的时候简单学了下strus2,好吧,现在已经全忘了,idea也是刚开始用,本来想按教程写个hello struts2,结果,出了以下系列问题. pre:step1-5是我按照百度的教程搭的 ...