Java-接口
原创约 1615 字大约 5 分钟...
106-Java-接口.md
注意
本博文仅供学术研究和交流参考,严禁将其用于商业用途。如因违规使用产生的任何法律问题,使用者需自行负责。
- 接口的概念
- 接口中只包含常量和抽象方法,而没有变量和方法的实现
- 接口对类来说是一套规范,是一套行为协议;
- 接口不是一个类,不能实例化
[访问权限修饰符] interface 接口名 {
接口的成员
}
- 接口的成员:
- 常量(字段)
- 抽象方法
拓展:
interface Runnable {
public abstract void run();
}
- 注意:
- 接口不是一个类,没有构造器,不能被实例化
- 接口使用interface关键字来定义,而不是class
- 接口默认:
- 常量:public static final
- 抽象方法: public abstract
练习:
给定以下代码:
public interface Foo{
int k = 4;
}
下列选项中,哪些选项可以用来替代第2行代码?
A.final int k = 4;
B.public int k =4;
C.static int k = 4;
D.private int k = 4;
D.abstract int k = 4;
答案:ABC
下列选项中,哪些可以定义在一个接口中?
A.void methoda();
B.public double methoda();
C.public final double methoda();
D.static void methoda(double dl);
E.protected void methoda(double dl);
答案:AB

接口可以实现多继承:
- 用接口可以实现混合类型(主类型,副类型),java 中可以通过接口分出主次类型
- 主类型使用继承,副类型,使用接口实现
接口可以使方法的定义和实现相分离,降低模块间或系统间的耦合性
- 针对接口编程可以屏蔽不同实现间的差异,看到的只是实现好的功能。
类实现接口 — implements
- 为了使用一个接口,你要编写实现接口的类
- 如果一个类要实现一个接口,那么这个类就必须实现接口中所有抽象方法。否则这个类只能声明为抽象类
- 多个无关的类可以实现一个接口,一个类可以实现多个无关的接口
- 一个类可以在继承一个父类的同时,实现一个或多个接口
接口和类的关系

有一个Student类
该类继承了Person类,并实现了Consumer接口
该类具有String类型的属性school
并有一个study方法,在该方法中,系统可打印出学生在那所学校学习
并创
接口与抽象类的对比
- 接口不能含有任何非抽象方法,而抽象类可以。
- 类可以实现多个接口,但只能有一个父类。
- 接口和接口之间可以多继承
如:public interface A extends B,C B,C也是接口. - 抽象类可以理解为抽象方法和非抽象方法的混合体,而接口中的方法完全是抽象方法,是一套纯粹的规范。一般来说,有关系的类才能继承同一个抽象类,而无关的类不可能有同一个抽象父类,但是无关的类可以实现同一个接口。
示例代码1
package 接口;
/**
* 接口
* <p>Title: TestInterface1</p>
* <p>Description: </p>
* @author xianxian
* @date 2019年7月6日
*/
public interface TestInterface1 {
// private int id;//代码报错不给过
// public void setName() {
//
// }//代码也不让过。。。
public static final String COMPANY_NAME = "TENCENT";//可以定义常量
public void showName();//可以定义抽象方法
public static void showId() {
//可以定义静态方法
}
default void showMoney() {
//定义默认方法ok
}
}
package 接口;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class MyFrame {
public static void main(String[] args) {
JFrame frame = new JFrame("我的第一个窗体");
frame.setSize(200,200);
JButton btn = new JButton("click me");
// ActionListener a = new ActionListener();//报错,接口不能被实例化,
//但是我们可以通过另一种方法把接口“实例化”,如下所示
btn.addActionListener(new ActionListener() {//匿名内部类:
//1.让一个匿名内部类实现ActionListener接口
//2.把这个内部类实例化
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("哎呀,你点击我咯");
}
});
frame.add(btn);
frame.setVisible(true);
}
}
示例代码2
package 接口.实例;
public class Dao {
public void add () {
System.out.println("add()");
}
public void delete() {
System.out.println("delete()");
}
public void update() {
System.out.println("update()");
}
}
package 接口.实例;
public class Service {
private Dao dao;
public Dao getDao() {
return dao;
}
public void setDao(Dao dao) {
this.dao = dao;
}
public void register() {
dao.add();
}
}
package 接口.实例;
public class Test {
public static void main(String[] args) {
Service s = new Service();
Dao dao = new Dao();
s.setDao(dao);
s.register();
}
}
从以上代码可以发现service层与dao层严重的耦合,这个时间需要解耦合, 在 Dao.java右键 ---> Refactor ---> Extrac Interface ---> 选择需要抽取的接口以及命名点击Finish即可


解耦合后的代码如下:
package 接口.实例;
public class Dao implements DaoIfac {
/* (non-Javadoc)
* <p>Title: add</p>
* <p>Description: </p>
* @see 接口.实例.DaoIfac#add()
*/
@Override
public void add () {
System.out.println("add()");
}
/* (non-Javadoc)
* <p>Title: delete</p>
* <p>Description: </p>
* @see 接口.实例.DaoIfac#delete()
*/
@Override
public void delete() {
System.out.println("delete()");
}
/* (non-Javadoc)
* <p>Title: update</p>
* <p>Description: </p>
* @see 接口.实例.DaoIfac#update()
*/
@Override
public void update() {
System.out.println("update()");
}
}
package 接口.实例;
public class Service {
private DaoIfac dao;
public DaoIfac getDao() {
return dao;
}
public void setDao(DaoIfac dao) {
this.dao = dao;
}
public void register() {
dao.add();
}
}
package 接口.实例;
public interface DaoIfac {
void add();
void delete();
void update();
}
package 接口.实例;
public class Test {
public static void main(String[] args) {
Service s = new Service();
DaoIfac dao = new Dao();
s.setDao(dao);
s.register();
}
}
示例代码3
package 接口.实例;
public interface B {
}
package 接口.实例;
public interface C {
}
package 接口.实例;
public interface D extends DaoIfac,B,C{
}
package 接口.实例;
public class Dao implements D {//一个类可以实现多个接口,多个接口 之间用,号隔开
/* (non-Javadoc)
* <p>Title: add</p>
* <p>Description: </p>
* @see 接口.实例.DaoIfac#add()
*/
@Override
public void add () {
System.out.println("add()");
}
/* (non-Javadoc)
* <p>Title: delete</p>
* <p>Description: </p>
* @see 接口.实例.DaoIfac#delete()
*/
@Override
public void delete() {
System.out.println("delete()");
}
/* (non-Javadoc)
* <p>Title: update</p>
* <p>Description: </p>
* @see 接口.实例.DaoIfac#update()
*/
@Override
public void update() {
System.out.println("update()");
}
}
package 接口.实例;
public interface DaoIfac {
void add();
void delete();
void update();
}
package 接口.实例;
public class Service {
private DaoIfac dao;
public DaoIfac getDao() {
return dao;
}
public void setDao(DaoIfac dao) {
this.dao = dao;
}
public void register() {
dao.add();
}
}
package 接口.实例;
public class Test {
public static void main(String[] args) {
Service s = new Service();
DaoIfac dao = new Dao();
s.setDao(dao);
s.register();
}
}
分割线
相关信息
以上就是我关于 Java-接口 知识点的整理与总结的全部内容,另附源码
Powered by Waline v2.15.4