Java-接口

涎涎原创约 1615 字大约 5 分钟...JavaJava

106-Java-接口.mdopen in new window

注意

本博文仅供学术研究和交流参考,严禁将其用于商业用途。如因违规使用产生的任何法律问题,使用者需自行负责。

  • 接口的概念
    • 接口中只包含常量和抽象方法,而没有变量和方法的实现
    • 接口对类来说是一套规范,是一套行为协议;
    • 接口不是一个类,不能实例化
[访问权限修饰符]  interface   接口名 {
                          
                    接口的成员

}
  • 接口的成员:
    • 常量(字段)
    • 抽象方法

拓展:

阿里天气接口open in new window

京东APIopen in new window

Java 8 新特性:接口的静态方法和默认方法open in new window

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-接口 知识点的整理与总结的全部内容,另附源码open in new window

上次编辑于:
贡献者: 涎涎
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.4