21.接口

上一篇:20.抽象类



一.引入

在Java中由于继承只支持单继承,为了实现类似于多重继承的效果,Java提供了接口来拓展类的功能,以弥补了Java中单继承的缺点。


二.接口的语法

(一).接口定义

[ public ] interface interfaceName [extends superInterfaceList]{
	常量属性
	抽象方法
}

注意:
1、关键字interface;
2、接口中的方法只有声明,没有定义(没有方法体);
3、接口中的所有属性:默认的修饰符是 public static final
4、接口中的所有方法:默认的修饰符是 public abstract

示例:

public interface MyInterface {	
	int age = 20;
	// 属性默认的修饰符是 public static final
	
	void eat();
	// 方法默认的修饰符是 public abstract
	void sleep();
}

从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。

(二).接口实现

类与类之间有继承关系,但是接口与类之间的关系叫做实现。类实现接口使用关键字implement,一个类可以实现一个或多个接口;假若实现了多个接口,每个接口之间使用逗号隔开。

1.单接口实现

这里实现了上述中的接口:

public class MyInterfaceClass implements MyInterface{

	@Override
	public void eat() {
		// 实现MyInterface中声明的eat()方法
		System.out.println("这是实现了MyInterface中声明的eat()方法");
	}

	@Override
	public void sleep() {
		// 实现MyInterface中声明的sleep()方法
		System.out.println("这是实现了MyInterface中声明的sleep()方法");
		
	}

}

2.多接口实现

多接口的实现就是在一个类中实现多个接口,在implement子句中用逗号将其分隔。
例如:有接口A、B、C,类D实现了A、B、C:

接口A:

public interface A {
	void printA();

}

接口B:

public interface B {
	void printB();

}

接口C:

public interface C {
	void printC();

}

实现接口类D:

public class D implements A,B,C{

	@Override
	public void printC() {
		System.out.println("这是实现接口C中的方法");
		
	}

	@Override
	public void printB() {
		System.out.println("这是实现接口B中的方法");
	}

	@Override
	public void printA() {
		System.out.println("这是实现接口A中的方法");
		
	}

}


三.接口继承

接口是支持多重继承的,即一个接口可以有多个父接口。
例如:定义接口A、B、C,接口D继承A、B、C同时定义D中的方法:
接口A:

public interface A {
	void printA();

}

接口B:

public interface B {
	void printB();

}

接口C:

public interface C {
	void printC();

}

接口D:

public interface D extends A,B,C{
//一个接口继承多个接口
	void printD();//D中的方法

}

现在,在接口D中继承了接口A,B,C;同时定义了printD;因此接口D中现在就有了四个方法(包括继承自接口中的方法)。


四.接口与抽象类

实现接口的类也可以使抽象类,这个类可以不实现接口中的方法,它把这些方法都作为自身的抽象方法。因此,在抽象类中可以不需要实现所有方法,可以留在子类中定义。
例如:

接口:

public interface MyInterface {
	void print();

}

实现接口的抽象类:

public abstract class TestMyInterface implements MyInterface{
	// 实现MyInterface的抽象类,自身不实现也不会编译出错。可以让其子类定义
}

继承自抽象类的类:

public class Test extends TestMyInterface{

	@Override
	public void print() {
		// 继承自TestMyInterface类并且定义接口中的方法
		// 这里如果不去定义接口中的方法,就会编译出错
	}

}


五.接口应用

例一,Son继承了Father的财产,现在还需要继承Mother的财产,由于Java只支持单继承,只可以继承其中之一的财产。如果要实现两者都继承,那么就将Mother定义为接口,从而也获得了Mother的财产:

public class Father {
	public double fatherMoney() {
		return 9999999;
	}
}
public interface Mother {
	double motherMoney();
}
public class Son extends Father implements Mother{
	@Override
	public double fatherMoney() {
		//  Father的fatherMoney()方法
		return super.fatherMoney();
	}

	@Override
	public double motherMoney() {
		// 实现month中的motherMoney()方法
		return 8888888.8;
	}

}

例二,Pencil继承了Pen的write方法,现在希望Pen还具有Eraser的clean功能;
我们将Eraser定义为接口,从而去扩展Pen的clean功能。

public class Pen {
	void write() {
		System.out.println("写字");
	}

}

public interface Eraser {
	void clean();
}
public class Pencil extends Pen implements Eraser{
	
	@Override
	void write() {
		// 写字的功能
		super.write();
	}

	@Override
	public void clean() {
		// 擦除功能
		System.out.println("擦除");
	}
}


六.接口总结

1、接口没有构造方法;
2、接口中定义的所有属性默认修饰是 public static final;
3、接口中定义的所有方法默认是 public abstract;
4、由于接口中的定义的所有方法都是抽象的,所以接口不能被实例化;
5、有抽象函数的不一定是抽象类,也可以是接口;
6、类可以通过implement实现接口,一个类可以实现多个接口;
7、如果类没有实现接口中的所有方法,那么类必须是抽象类;
8、如果在类中访问类接口中的属性,不能使用 super 关键字,因为两者之间没有继承关系。可以使用“接口名.属性名”访问。


下一篇:22.多态

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值