Java笔记----第九章(IX) 接口

一、接口

1.接口概念

概念: 接口是有若干常量定义和一组抽象方法组成。(接口不包括变量和有具体实现的方法。)
接口是一种特殊的抽象类,它比抽象类还要抽象,它只能包括常量和方法的声明,而没有变量和方法的实现。
注:接口中的方法是由它的实现类来实现!

2.接口定义

接口是由常量抽象方法两部分组成,定义一个接口跟创建一个类非常相似。接口定义包括接口声明和接口体。

格式如下:

[public] interface 接口名 [entends 父类口列名]{
    
    
//接口体包括常量声明和方法定义
//常量声明
[public] [static] [final] 数据类型 常量名=常量值;
//抽象方法声明
[public] [abstract] 返回类型 方法名(参数列表);
}

注意:
1. interfance是定义接口的关键字,接口名用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下:要求首字母大写。
2. interfance关键字前面的public 为可选值,用于指定接口的访问权限。如果省略则使用默认的访问权限,只能被同一个包中的其它类和接口使用。
3. 接口也可以被继承,它将继承父接口中的所有属性和方法。使用extends关键字可以继承接口。注意:一个接口可以继承多个父接口,它们之间用“ ,” 分割,形成父接口列表。
4. 接口体中不能存在构造方法,定义的方法只能是抽象方法,即只提供方法的定义,而没有提供方法的实现。
5. 接口中的变量都是具有public、static和final修饰符的常量,这些修饰符都可以省略,效果一样。
6. 接口中的方法都是public和abstract修饰的方法,这些修饰符也可以省略。

3.接口实现

接口在定义后,要想实现接口,就需要借助于类来实现该接口。在类中实现接口可以使用关键字implements,基本格式如下:

[修饰符] class <类名> [extends 父类名] [implements 接口列表]{
    
    
    //类体
}

可选参数,用于指定类的访问权限,可选值为public、abstract和final。
注意:
1. “类名”必须是必选参数,用于指定类的名称,类名必须是合法的Java标识符。
2. 可选参数,用于指定要定义的类继承于哪个类。
3. 可选参数,用于指定该类实现的是哪些接口。当使用implements关键字时,接口列表为必选参数。当接口列中存在多个接口关键名时,各个接口名之间用逗号分隔。
4. 在类中实现接口时,方法的名字返回值类型参数的个数类型必须与接口中的完全一致,并且必须实现接口中的所有方法。

4.*接口与抽象类区别

(接口是特殊的抽象类!)
1. 相同点: 都不能直接实例化。即不能直接new对象,必须通过子类实例化。
2. 不同点:
1>抽象类包括一般方法,为抽象方法、常量和变量;而接口只能包括常量和抽象方法。
2>抽象类可以有构造方法;而接口不能有构造方法。
3>抽象类可以实现多个接口;而接口不能继承一个抽象类。
4>如果继续抽象类时会引发单继承所带来的局限性,而通过实现接口的方法能够解决单继承带来的局限性。

5.*接口综合案例
/接口的定义
public interface CalInterface {
    
    
	//常量定义
	float PI = 3.141592f;//省略public static final
	//方法的声明
	public float getArea(float r);
	public float getCircumference(float r);
}

//继承接口的类
public class Circle implements CalInterface{
    
    
	//实现接口里面的方法
	public float getArea(float r) {
    
    
		return PI*r*r;
	}
	public float getCircumference(float r){
    
    
		return 2*PI*r;
	}
}

//测试类
public class EX9_1 {
    
    

	public static void main(String[] args) {
    
    
		CalInterface c = new Circle();
		System.out.println("圆的面积是:"+c.getArea(2.5f));
		System.out.println("圆的周长是:"+c.getCircumference(2.5f));
	}
}

//运行结果:
圆的面积是:19.63495
圆的周长是:15.70796

二、接口的使用场合

1.使用场合1

多重继承!

Java中引用了接口来实现多重继承。
注意: 通常情况下,为了实现多重继承,可以把类都定义为接口,但一旦都定义为接口后,当子类去实现这个接口时,必须要把这个接口的所以方法都实现。

2.使用场合2

可扩展性和可维护性!

三、接口的有关设计模式

1.配置器设计模式

由于接口中所有的方法都是抽象方法,如果类实现接口,就必须全部重写接口中的抽象方法,但有些类不需要全部重写这些方法,这就需要用到如下的方法来解决:

在这里插入图片描述

2.简单工厂设计模式

假设有1000个创建子类对象的地方,如果想要修改创建的子类,直接去修改会很麻烦,而且耗时长。但是如果抽象出一个工厂类,用来生产各种符合子类规范的方法,解决起来就轻松多了。

代码如下:

//计算机上的USB接口规范
public interface USB {
    
    
	
	public void start();//开始工作
	public void stop();//停止工作
}

//继承USB接口的MP3类
public class MP3 implements USB{
    
    
	//实现USB接口所有方法
	public void start() {
    
    
		System.out.println("MP3开始播放!");
	}
	
	public void stop() {
    
    
		System.out.println("MP3停止播放!");
	}
}

//继承USB接口的UDisk类
public class UDisk implements USB{
    
    
	//实现USB接口所有方法
	public void start() {
    
    
		System.out.println("U盘开始工作!");
	}
	
	public void stop() {
    
    
		System.out.println("U盘停止工作!");
	}
}

//Computer类
public class Computer {
    
    
	public void plugin(USB usb) {
    
    
		usb.start();
		usb.stop();
	}
}

//测试类
public class USBSimulator {
    
    

//定义了工厂类
class Factory{
    
    
    public static USB getUSBInstance(){
    
    
          return new UDisk();
    }
}
//main函数
	public static void main(String[] args) {
    
    
		//生产一台电脑
		Computer c = new Computer();
		//生产一个U盘
		UDisk u = new UDisk();//还可以写成USB usb = Factory.getUSBInstance();
		c.plugin(u);
		//生产一个MP3
		MP3 m = new MP3();
		c.plugin(m);

	}
}

猜你喜欢

转载自blog.csdn.net/qq_46340895/article/details/105501596