接口和抽象类能够体现OOP的抽象,而接口和抽象类也是日常开发中经常用到的

抽象方法:

抽象方法就是被abstract修饰的方法,只有声明,没有实现,也就是没有方法体

public abstract void f1();

在接口中修饰符和abstract都可以不写,因为会被编译器隐式的指定

抽象类:包含抽象方法的类

1、抽象类可以有抽象方法和非抽象方法,甚至可以没有抽象方法,但是这样没有意义

public abstract class MyAbstractClass {
abstract void add();
void del(){ };
}

2、可以有构造器,但不能实例化去创建对象,你只能这样写

public static void main(String[] args) {
MyAbstractClass myAbstractClass = new MyAbstractClass() {
@Override
void add() {
System.out.println("add()");
}
};
myAbstractClass.add();
}

PS:这样本身不是实例化,而是重写方法,否则会报错。这只是创建了一个匿名内部类。

3、抽象方法的修饰符不能是private,因为需要被实现的。默认情况下是default,个人认为不是public

package com.it.nine;
public abstract class MyAbstractClass {
public MyAbstractClass() { }
abstract void add();
}

原因如下:

上面抽象类中定义了一个默认的add()

  1、在另一个包继承这个类,是无法实现add(),而把add()修饰符改成public就可以了

  2、同包下去继承这个类,实现add(),修饰符也是默认,而不是public,这个类并不是抽象类,public和默认肯定不一样吧

public class Test extends MyAbstractClass{
@Override
void add() { }
}

4、如果一个类继承抽象类,必须实现抽象类中所有的抽象方法,除非这个类也是抽象类

public abstract class Test extends MyAbstractClass{

}

接口:更加抽象的抽象类

public interface Interface1 {
public String s = "";
void f1();
void f2();
}

上面就是接口的一般形式

1、接口里都是抽象方法,默认被public修饰,无论是否显式指明

2、不能有构造器,原因基于第一条

3、成员变量默认是public static final修饰,IDE中可以看到s是斜体(static),而且必须有初始值(final),否则编译报错

4、如果一个类实现接口,必须实现接口中所有的方法,除非这个类也是抽象类

相同点:

  接口和抽象类的修饰符都是public,无论是否声明

接口和抽象类的区别:

除了上面写的区别之外,接口和抽象类还有一些语法层面的不同:

1、抽象类可以有非抽象方法,而接口中的方法只能是public

2、抽象类的成员变量可以是各种类型,而接口中的成员变量只能是public static final类型的

3、接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法

4、一个类只能继承一个抽象类,而一个类却可以实现多个接口

5、抽象类可以有构造函数,接口中没有构造函数

6、抽象类可以有代码块和静态块,接口不可以

设计层面的差别:

  继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是

有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口

举个栗子:

abstract class Door {
public abstract void open();
public abstract void close();
}

或者:

interface Door {
public abstract void open();
public abstract void close();
}

现在添加报警alarm( )的功能,那么该如何实现?下面提供两种思路:

  1、将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;

  2、将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。

  从这里可以看出,Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将

报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。

interface Alram {
void alarm();
} abstract class Door {
void open();
void close();
} class AlarmDoor extends Door implements Alarm {
void oepn() {
//....
}
void close() {
//....
}
void alarm() {
//....
}
}

接口实现多继承

java中只能实现单继承,而我们可以通过接口进行多继承(接口肯定不能implements)

public interface Interface1 {
void f1();
void f2();
}
public interface Interface2 {
void f3();
void f4();
}
public interface Interface3 {
void f5();
void f6();
}
public interface ExtendInterface extends Interface1, Interface2, Interface3{ //多继承
void extend();
}
public class MyInterface implements ExtendInterface{
@Override
public void extend() { }
@Override
public void f1() { }
@Override
public void f2() { }
@Override
public void f3() { }
@Override
public void f4() { }
@Override
public void f5() { }
@Override
public void f6() { }

PS:当类实现这个多继承的接口ExtendInterface,需要实现之前所有接口的方法

PS:抽象类可以实现接口,可以选择是否实现接口的方法,如果不实现的话,抽象类的实现类需要实现抽象类和接口中的方法

问题:为什么抽象类有构造函数,接口中却没有?

  首先抽象类虽然有构造函数,但是不能被实例化的。构造函数这里的作用,在子类被初始化的时候,必须初始化父类(抽象类)数据,而不是生成一个父类对象

,因为子类初始化有可能要用到父类的数据。

  而接口中都是抽象方法,没有实现的,所有的属性都是常量(final修饰),编译器直接生成ConstantValue属性,需要赋初值。

所以接口不需要构造函数。

jdk8+接口定义的变化:

1、可以定义static方法、默认方法

public interface MyInterface {

    void f();

     static void f2() {
System.out.println("interface f2");
} default void f3() {
System.out.println("interface f3");
} }
public class Test implements MyInterface {

    @Override
public void f() { } @Override
public void f3() {
MyInterface.super.f3();
} public static void main(String[] args) {
new Test().f3();
MyInterface.f2();
}
}

static和default修饰符为public,可以省略。static方法可以通过interface直接调用,而default方法只能上面那种方式去实现

内容参考:<Java编程思想>和https://www.cnblogs.com/dolphin0520/p/3811437.html

Java基础(四)--接口和抽象类的更多相关文章

  1. 【Java基础】接口和抽象类之间的对比

    Java 中的接口和抽象类之间的对比 一.接口 Interface,将其翻译成插座可能就更好理解了.我们通常利用接口来定义实现类的行为,当你将插座上连接笔记本的三角插头拔掉,换成微波炉插上去的时候,你 ...

  2. Java基础之接口与抽象类及多态、内部类

    final关键字 被其修饰的类,不能被继承. 被其修饰的方法,不能被覆盖. 被其修饰的变量,是一个常量,不能被修改,所以定义时必须初始化(和C++的const类似). 一般有final,会搭配stat ...

  3. Java基础——关于接口和抽象类的几道练习题

    呃,一定要理解之后自己敲!!!这几道题,使我进一步了解了接口和抽象类. 1.设计一个商品类 字段: 商品名称,重量,价格,配件数量,配件制造厂商(是数组,因为可能有多个制造厂商) 要求: 有构造函数 ...

  4. java基础之接口(抽象类与接口的区别)

    概述 猫狗案例,我们想想狗一般就是看门,猫一般就是作为宠物了,对不.但是,现在有很多的驯养员或者是驯的,这应该属于经过特殊的培训训练出来的,对不.所以,这些额外的动作定义到动物类中就不合适,也不适合直 ...

  5. 【java基础】接口VS抽象类

    1.至少有一个被abstract修饰的方法,同时修饰类名的类为抽象类,抽象的方法必须被子类覆盖,抽象的类必须被继承,抽象的类可以包含非抽象方法,只能单继承. 2.接口中所有的变量是static fin ...

  6. 30.Java基础_接口_抽象类_具体类实现案例

    public interface SpeakEnglish { public abstract void speak(); } public abstract class Person { priva ...

  7. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...

  8. Java基础-面向接口(interface)编程

    Java基础-面向接口(interface)编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的“类 ...

  9. Java基础十--接口

    Java基础十--接口 一.接口的定义和实例 /* abstract class AbsDemo { abstract void show1(); abstract void show2(); } 8 ...

随机推荐

  1. Java 中 modifer &#39;public&#39; is reduntant for interface methods

    http://androidren.com/index.php?qa=322&qa_1=java-%E4%B8%AD-modifer-public-is-reduntant-for-inter ...

  2. 1.Urllib2模块使用

    网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. Urllib2介绍: urllib2 是 Python2.7 自带的模块(不需要下载,导入即可使用) urllib2 官方文 ...

  3. Cannot change version of project facet Dynamic Web Module to 3.1 (Eclipse Maven唯一解决方式)

    If you want to use version 3.1 you need to use the following schema: http://xmlns.jcp.org/xml/ns/jav ...

  4. C#.NEt-GDI+中的Pen測试

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. CSP 201612-4 压缩编码 【区间DP+四边形不等式优化】

    问题描述 试题编号: 201612-4 试题名称: 压缩编码 时间限制: 3.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一段文字,已知单词a1, a2, …, an出现的频率分别t1 ...

  6. 怎么查询数据库中第30到40条记录呢? 通过ID,查询当前第30-40条记录 注意,ID不是顺序的

    http://blog.csdn.net/lee576/article/details/5812347 http://bbs.csdn.net/topics/190070614 http://www. ...

  7. Web 设计与开发者必须知道的 15 个站点

    新闻来源:catswhocode.com公司博客整整一个月没有更新了,最近一段时间,全公司都忙于两件事,为海尔集团做定制,为一个合作伙伴做 OEM,终于有了眉目.工作期间,常用到一些工具与帮助站点,今 ...

  8. [NOI 2014] 起床困难综合征

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3668 [算法] 从高位向低位贪心即可 时间复杂度 : O(30N) [代码] #in ...

  9. bzoj1999 (洛谷1099) 树网的核——dfs

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1999  https://www.luogu.org/problemnew/show/P109 ...

  10. bzoj1036 [ZJOI2008]树的统计Count——LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1036 LCT水题! 然而没有1A(咬牙)! 注意值有负数,所以取 max 的话要把作为“哨兵 ...