深入理解——接口

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class exp5_3 extends JFrame implements MouseListener, MouseMotionListener{
	int x1, y1, x2, y2;             // 类exp5_3使用了关键字 MouseListener和MouseMotionListener实现了两个接口。
	public exp5_3 () {
		setTitle ("画直线");
		setSize(400,300);
		setVisible(true);
		addMouseListener(this);
		addMouseMotionListener(this);
	}
	public void paint(Graphics g) {
		super.paint(g);
		g.drawLine(x1, y1, x2, y2);
	}
	public void mousePressed(MouseEvent e) {
		x1 = e.getX(); y1 = e.getY();
	}
	public void mouseDragged(MouseEvent e) {
		x2 = e.getX(); y2 = e.getY(); repaint();
	}
	public void mouseClicked(MouseEvent e) {}
	public void mouseEntered(MouseEvent e) {}
	public void mouseExited(MouseEvent e) {}
	public void mouseReleased(MouseEvent e) {}
	public void mouseMoved(MouseEvent e) {}
	public static void main(String args[]) {new exp5_3();}
}

注意:(1)实现接口时,要实现所有接口中定义的所有方法。(2)实现的方法可以带有具体的实现内容,也可以是抽象方法,即只有方法名或参数,没有变量,没有具体操作语句,没有大括号{}的空方法。

创建自定义接口 ——就像创建类一样

语法格式如下:

[修饰符] interface 接口名 [extends 父接口名列表] {
 	[public] [static] [final 常量;
 	[public] [abstract] 方法;
 	}
 	

方法:接口中的方法只有定义而没有被实现。接口体中主要声明一些公用的常量,声明一些公用的、静态空方法。

interface N1{
	int year = 2017;  //常量
	int age();		//抽象方法
	void output();  //抽象方法
  • Java 编译器和解释器会自动把接口中声明的变量当作 static final 类型的变量(即常量 ),不管是否使用了这些修饰符。接口中的变量不能被修改
  • 接口中声明的变量都必须设置初值,否则会产生编译错误。
  • 接口中的方法都默认为 abstract ,不管有没有这些修饰符。与类、成员变量即方法一样,接口也可以使用一些访问控制修饰符进行限制,也可以不用,如果使用了 public ,表示可以被任意的类使用。
  • 接口名首字母大写,定义接口的源程序文件也保存为与接口名相同的.java文本文件,然后编译为同名的 .class文件。编译后其他类就可以通过其 class 文件使用该接口了。
public class exp5_3 implements N1{
	String xm;
	int csrq;
	public exp5_3 (String n1,int y) {
		xm = n1; csrq = y;
	}
	public int age( ) {
		return year-csrq;
	}
	public void output() {
		System.out.println(this.xm + "今年的年龄是"+ this.age() + "岁");
	}
	public static void main(String args[]) {
		exp5_3 a = new exp5_3("张弛",1990);
		a.output();
	}
}

我们以前提到过,接口的作用是指定了系统各模块间遵循的标准,体现的是一种规范,因此,接口一旦被定义之后就不应该轻易改变,一旦改变会对整个系统造成影响。这就像每年的高考一样,高考的宏观规定和标准国家已经规定好了,但并不会有具体详细措施因为具体办法的实行各个地方就不同了,需要它们自己去按照国家规定的标准来, 规定一改,对所有地区的不管是学生还是政府都会有很大的影响,正所谓牵一发而动全身。

在上面接口 N1 定义了 age(), output()方法,它们是空的,但是它规定了接口的调用者可以调用的服务,下面的类则实现了这两个方法的具体操作。

接口的多继承

和Java其他类一样,接口具有继承性,子接口可以继承父接口的所有成员,与类不同的是接口可以实现多继承

  1. 接口的单继承
interface A {void F1();}
interface B extends A {void F2();}

注: 接口B将继承接口 A中的所有变量和方法,这种接口之间的继承称为单继承,如果一个类为B 的实现类,那么它必须实现接口A和接口B中的全部方法。
实现类必须实现接口的全部方法,如果接口还有父接口,也要实现,因为接口中的方法都是抽象方法,抽象方法要么在抽象类中出现, 要么非抽象类把抽象方法全部实现

捋一下:
功能决定特性。 接口就像政府的宏观政策一样。它指定了系统各模块之间遵循的标准,体现的是一种规范。

  • 不可更改性(所以定义的变量全部隐含为final 和 static类型,变量不能被实现类改变,且有初值),就像各个地方不能改动宏观政策的任何一部分。
  • 宏观性 宏观政策(接口)不具备具体的措施,告诉你要实现什么标准,如何具体实现交给地方(实现类)来实现。所以方法都是抽象的,没有实现的具体细节。
  • 完整性 地方(实现类)在根据宏观政策制定具体实施细节时(实现接口的类方法)不能有所漏缺,因为宏观政策的每一条(都是抽象方法)在具体实施中(应用到非抽象类时)必须全部实现。

接口变量和接口回调

接口变量是指用接口声明的变量,接口变量经过初始化可以变成接口实例对象,因为接口本身含有抽象方法,所以接口不能通过自身初始化,而是通过接口的实现类来进行初始化任务。
接口回调是指接口A型变量 a ,由其实现类B初始化后,通过 a 调用由 B 实现的接口 A 的方法。

interface Eatfood {
	void Eat();
}

class Chinese implements Eatfood{
	public void Eat() {
		System.out.println("中国人使用筷子");
	}
}
class America implements Eatfood {
	public void Eat() {
		System.out.println("美国人使用刀叉。");
	}
}
public class exp5_3{
	public static void main(String[] args) {
		Eatfood em;                  //定义了 Eatfood 接口变量 em
		em = new Chinese(); 		//由其实现类进行初始化
		em.Eat();
		em = new America();  //由其实现类初始化
		em.Eat();
	}
}

通过上例可以发现,接口回调与对象向上转型是类似的,向上转型是通过子类对象向上转型调用子类重载的父类方法。接口回调是通过实现类的实例对象回调实现类实现的接口方法。

接口的默认方法

新增特性是允许在接口中定义非抽象的方法,在接口中只需在方法前添加default 关键字即可,这个方法称为默认方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值