第六章 接口与实现
先提小结内容,大概知道要学的
(1)接口的接口体中只可以有常量和abstract方法。
(2)和类一样,接口也是JAVA中的一种重要的引用型数据类型,接口变量中只能存放实现该接口的类的实例(对象)的引用。
(3)***当接口变量中存放了实现接口的类的对象的引用后,接口变量就可以调用类实现接口的方法,这一过程被称为接口回调。
(4)和子类体现多态类似,由接口产生的多态就是指不同的类在实现同一个接口时可能具有不同的实现方式。
(5)在使用多态设计程序时,要熟练使用接口回调技术以及面向接口编程的思想,以便体现程序设计所提倡的“开-闭原则”。
1.接口
接口的特点:
- A:接口用关键字interface表示
interface 接口名{ }- B:类实现接口用implements表示
class 类名 implements 接口名 { }- C:接口不能实例化
那么接口如何实现实例化呢?
按照多态的方式来实例化。
其中
- 具体类多态(几乎没有)
- 抽象类多态(常用)
- 接口多态(最常用)
- D:接口的子类:
a:可以是抽象类,但意义不大
b:可以是具体类,要重写接口中的所有抽象方法。- E:接口体:
接口体中包含常量的声明(没有变量)和抽象方法两部分。接口体 中只有抽象的方法,没有普通的方法,而且接口体中所有的常量的访问权限一定都是public,而且是static常量(允许省略public、final和static修饰符),所有的抽象方法的访问权限一定都是public(允许省略public、abstract修饰符)?接口成员的特点:
- 成员变量:只能是常量,而且是静态的
(默认修饰符:public static final )- 构造方法:接口没有构造方法,因为接口主要是扩展功能的,而没有具体存在
所有类都继承object- 类Object是类层次结构的根类,每个类都使用Object作为超类。
默认格式:class Dog extends Object {}- 成员方法:只能是抽象方法
默认修饰符:public abstract
//例1
interface Printable{
public final static int Max=100; //等价写法: int Max=100;
public abstract void add(); //等价写法: void add();
public absract float sum(float x,float y); //等价写法: float sum(float x,float y);
}
//例2
interface AnimalTrain{
public abstract void jump();
}
//抽象类实现接口
abstract class Dog implements AnimalTrain {
}
//具体类实现接口
class Pig implements AnimalTrain {
public void jump() {
System.out .println("猪可以上树了");
}
}
class InterfaceDome {
public static void main(String[] args) {
//AnimalTrain是抽象的,无法实例化
//AnimalTrain at=new AnimalTrain();
//at.jump();
AnimalTrain at=new Pig();
at.jump();
}
}
?理一下关系
类与类:继承关系,只能单继承,可以多层继承。
类与接口:实现关系,可以单实现,也可以多实现,并且还可以在继承一个类的同时实现多个接口
接口与接口:继承关系,可以单继承,也可以多继承。
interface Father{
public abstract void show();
}
interface Mother{
public abstract void show2();
}
interface Sister extends Father,Mother{ //接口间的继承关系可以单继承,也可以多继承
}
//class Son implements Father,Mother
class Son extends Object implements Father,Mother{
public void show(){
System.out.println("show son");
}
public void show2(){
System.out.println("show2 son");//可以单实现,也可以多实现
}
}
class InterfaceDemo3{
public static void main(String[] args) {
//创建对象
Father f=new Son();
f.show();
Mother m=new Son();
m.show2();
}
}
2.抽象类和接口的区别
1. 成员区别
抽象类:
可以变量,也可以常量
构造方法:有
成员方法:可以抽象,也可以非抽象
接口:
成员变量:只可以常量
成员方法:只可以抽象
2.关系区别
类与类:
继承,单继承
类与接口:
实现,单实现,多实现
接口与接口:继承,单继承,多继承
3.设计理念区别
抽象类: 被继承体现的是:“is a”的关系,抽象类中定义的是该继承体系的共性功能。
接口: 被体现的是:“like a”的关系,接口中定义的是该继承体系的扩展功能。
3.接口回调
可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法,实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这个调用的过程称为接口的回调,
JAVA中对象的赋值与引用 详解!!!
(https://blog.csdn.net/yz930618/article/details/76278997/)
/*接口回调例子*/
interface ShowMessage{
void 显示商标(String s);
}
class TV implements ShowMessage{
public void 显示商标(String s) {
System.out.println(s);
}
}
class PC implements ShowMessage{
public void 显示商标(String s) {
System.out.println(s);
}
}
public class Example6_3 {
public static void main(String[] args) {
ShowMessage sm; //声明接口变量
sm=new TV(); //接口变量中存放对象的引用
sm.显示商标("长城牌电视机");//接口变量调用被类实现的接口中的方法
sm=new PC(); //接口变量中存放对象的引用
sm.显示商标("联想奔月5008PC机");//接口回调
}
}
/*运行结果*/
//长城牌电视机
//联想奔月5008PC机
4.接口参数
如果一个方法的参数是接口类型,我们就可以将任何实现该接口的类的实例的引用传递给该接口参数,那么接口参数就可以回调类实现的接口方法。
interface SpeakHello {
void speakHello();
}
class Chinese implements SpeakHello {
public void speakHello() {
System.out.println("中国人习惯问候语:你好,吃饭了吗? ");
}
}
class English implements SpeakHello {
public void speakHello() {
System.out.println("英国人习惯问候语:你好,天气不错 ");
}
}
class KindHello {
public void lookHello(SpeakHello hello) { //接口类型参数
hello.speakHello(); //接口回调
}
}
public class Example6_5 {
public static void main(String args[]) {
KindHello kindHello=new KindHello();
kindHello.lookHello(new Chinese());
kindHello.lookHello(new English());
}
}
5.abstract类与接口的比较
接口和abstract类的比较如下:
1.abstract类和接口都可以有abstract方法。
2.接口中只可以有常量,不能有变量;而abstract类中即可以有常量也可以有变量。
3.abstract类中也可以有非abstract方法,接口不可以。
6.面向接口编程
面向接口去设计程序,可以通过在接口中声明若干个abstract方法,表明这些方法的重要性,方法体的内容细节由实现接口的类去完成。
使用接口进行程序设计的核心思想是使用接口回调,即接口变量存放实现该接口的类的对象的引用,从而接口变量就可以回调类实现的接口方法。