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_抽象类和接口的更多相关文章

  1. java_抽象类、接口、多态的使用

    抽象类 抽象类:包含抽象方法的类. 抽象方法 : 没有方法体的方法. 使用 abstract关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体. 格式为:修饰符 abstra ...

  2. 抽象类 VS 接口

    引言 接口和抽象类是面向对象编程(OOP, Object Oriented programming)中两个绕不开的概念,二者相似而又有所不同.接下来,我们来了解二者的概念并比较它们的异同. 什么是抽象 ...

  3. java抽象类和接口

    面向对象设计过程中重要的一点是如何进行抽象,即把"问题空间"中的元素与"方案空间"中的元素建立理想的一对一的映射关系.抽象类和接口便是抽象过程中的产物.     ...

  4. php中抽象类与接口的概念以及区别

    php里面的接口类,抽象类到底有什么用呢? 刚接触php的时候,觉得这个东西没什么用,其实这些东西还是有一定的作用的,下面我就简单的说说. 1.php 接口类:interface 其实他们的作用很简单 ...

  5. Java 抽象类与接口

    接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是 Java 语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予 Java 强大的面向对象的能力.他们两者之间对 ...

  6. 浅谈我对C#中抽象类与接口的理解

    C#中的抽象类与接口有些相似,初学者很容易混淆,今天就让我来谈谈对二者的理解. 首先我们得明确二者的含义,分述如下: 如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个 ...

  7. Atitit 深入理解抽象类与接口 attilax总结

    Atitit 深入理解抽象类与接口 attilax总结 1.1. 主要区别接口侧重于动作抽象..抽象类是属性名词抽象..1 1.2. 抽象层次类>>抽象类>>接口1 1.3. ...

  8. luogg_java学习_07_抽象类_接口_多态学习总结

    这篇博客总结了半天,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 , 抽象 一种专门用来做父类,被继承的. (模板) 格式: abs ...

  9. PHP中抽象类,接口定义

    这里先介绍接口,因为在我最近看的好几本php工具书中都没有提到抽象类. 本人也觉得,在理解了接口后抽象类也非常好理解. 例子代码随便写了一下.例子代码是很ok的,测试过了不会报错,懒得看代码的筒靴们看 ...

随机推荐

  1. linux 环境变量设置(临时 + 永久)

    临时设置: 1.直接用export命令: #export PATH=$PATH:/home/xyz/Tesseract/bintesseract可执行文件目录 #export LD_LIBRARY_P ...

  2. Gin 08 上传文件

    单文件上传 cat index.html <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  3. 什么是微服务架构 Spring Cloud?

    1 为什么微服务架构需要Spring Cloud 简单来说,服务化的核心就是将传统的一站式应用根据业务拆分成一个一个的服务,而微服务在这个基础上要更彻底地去耦合(不再共享DB.KV,去掉重量级ESB) ...

  4. 如何构建Docker镜像

    构建Docker 镜像有如下两种方法: (一)使用docker commit命令.(二)使用docker build命令和 Dockerfile 文件.在这里并不推荐使用docker commit来构 ...

  5. CF17E Palisection(manacher/回文树)

    CF17E Palisection(manacher/回文树) Luogu 题解时间 直接正难则反改成求不相交的对数. manacher求出半径之后就可以差分搞出以某个位置为开头/结尾的回文串个数. ...

  6. vmware克隆Centos虚拟机网卡无法启动问题

    快速处理办法: cat /etc/sysconfig/network-scripts/ifcfg-eth0 sed -i '/UUID/d' /etc/sysconfig/network-script ...

  7. BMZCTF phar???

    pchar??? 补充知识点 开始这题之前我们先补充一个知识点 phar 的文件包含 和上面类似先创建一个phar 标准包,使用 PharData 来创建,然后添加文件进去phar里面. 然后在文件包 ...

  8. Python 与 C++ 向量

    Python 与 C++ 向量 Python 和 C++ 对比 我们再回到向量!你已经学习了如何声明一个空的向量. 在下面的代码中,你可以比较 Python 列表和 C++ 向量的语法.你会看到,C+ ...

  9. React+Webpack+ES6 兼容低版本浏览器(IE9)解决方案

    虽然过了兼容IE6的噩梦时代,IE依旧阴魂不散,因为你可能还要兼容IE9.在ES6已经普及的今天,用ES6写react已经成了标配.但是babel编译的js语法,由于某些不规范的写法,可能在IE9下不 ...

  10. CSS揭秘之《多重边框》

    1.box-shadow还接受第四个参数(称作"扩张半径"), 通过指定正值或负值, 可以让投影面积加大或者减小2.如果我们想要一道实线边框其实也是可以通过box-shadow来模 ...