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. 微信网页JSDK接口-wx.chooseImage问题

    wx.chooseImage({count: 1, // 默认9sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有sourceTy ...

  2. Linux kernel cfg80211_mgd_wext_giwessid缓冲区溢出漏洞

    受影响系统:Linux kernel <= 5.3.2描述:CVE(CAN) ID: CVE-2019-17133 Linux kernel是开源操作系统Linux所使用的内核. Linux k ...

  3. Django基础必会

    Django基础必会 Django项目目录 mysite -mysite -__init__.py -urls.py(函数和函数的对应关系) -settings.py(Django项目的配置信息) - ...

  4. 14FPGA综设之图像边沿检测的sobel算法

    连续学习FPGA基础课程接近一个月了,迎来第一个有难度的综合设计,图像的边沿检测算法sobel,用verilog代码实现算法功能. 一设计功能 (一设计要求) (二系统框图) 根据上面的系统,Veri ...

  5. GitHub如何选择合适的license(许可证)

    license译为许可证,也可作为开源协议,它可以将自己创作的东西,授权给他人使用,并约定了使用者可以有的权利和必须遵从的义务.现在很多优秀的开源项目都有设置license,不同的license所约束 ...

  6. mysql innodb事务的ACID及其实现的保证机制

    MySQL事务的ACID,一致性是最终目的.保证一致性的措施有:A原子性:靠undo log来保证(异常或执行失败后进行回滚).D持久性:靠redo log来保证(保证当MySQL宕机或停电后,可以通 ...

  7. spring-boot-learning-MongoDB

    NoSQL可以极大提高互联网系统的性能,但是它有一些致命的缺陷,其中最为严重的就是计算功能卡分有限,例如,在一个10 万数据量的List 中,我只需要满足特定条件的元素在Red is 中,使用集合或者 ...

  8. SVN回滚步骤

  9. numpy计算数组中满足条件的个数

    Numpy计算数组中满足条件元素个数 需求:有一个非常大的数组比如1亿个数字,求出里面数字小于5000的数字数目 1. 使用numpy的random模块生成1亿个数字 2. 使用Python原生语法实 ...

  10. 8_LQR 控制器_状态空间系统Matlab/Simulink建模分析

    再线性控制器中讲到: 举例说明(线性控制器中的一个例子)博客中有说明 在matlab中:使用lqr求解K1.K2 这里希望角度(即x1)能迅速变化,所以Q矩阵中Q11为100,并没有关心角速度(dot ...