00013.01接口的概念以及声明和实现

一、声明是接口?

1、

接口的思想,一开始不是那么容易理解,但是语法很简单
原因是什么?因为编程思想没有到一定的高度,而接口是用在比较复杂的项目当中的,初学者也没有接触到稍微大一点的项目,我们做练习题的时候用接口反而会更复杂了,这样就导致天生的抗拒,我为什么要让我的代码变得“复杂”呢?哈哈,这样就导致了一种尴尬排斥的局面。
办法:你先不要去纠结为什么要使用接口,反正你要知道它很有用就行了,你看假如你去对接阿里支付宝 接口,这些,他不可能给你源代码,只能给你提供接口
1、什么是接口:
举例如我们的电脑接口为什么是USB接口而不是奇形怪状的呢,这就涉及到一种标准,你得按照我的来,才能正常使用
(1)电脑设计的时候见简单了,多提供几个USB接口就行了,这样就可以让很多设备(外设)能够连接进来,我们的代码也是一样的,预留一些接口给别人去使用,能让我们的项目可扩展性更高,这样也才能适应各个需求
(2)对于其它设备的厂商也简单了,只要你这个设备有与电脑连接的需求,那么就可以把连接口设计为USB
再例如:电源接口,我们的家用插座的接口,如果不一致,你怎么保证每个电器都能使用电呢
插座的设计和电器的设计都要有一个标准
(3)java当中也是一样,为了限定某些类,这些类之间可能都没有继承关系,甚至都不是一个派系里面的,但是这些类有相同的行为特征
比如
Bird类
Plane类
Kite类
这些类不是同一个父类派生出来的,但是又希望他们有相同的行为特征,这个时候就可以为他们设计接口
这个时候通过接口就可以同时管理这些类
这个时候可能会有人问了,我们可以用Object管理啊,但是Object有fly()这个1方法吗,没有,所以并不能想当然,是必须要用接口的方式来做的
以后我们使用JDBC 操作数据库,也是要遵循一定的规范的,因为不管你连接什么数据库,操作都是一样的,所以设计成了一系列的接口,只是数据库对象不一样而已,(比如SqlServer或者mySql等)但是都是要经过 连接、传sql语句、返回结果,这系列流程,这是不变的
Java中,设计了很多接口,Connection(连接数据库),Statement(执行sql语句),ResultSet(返回结果)
Java中无法去替数据库厂商,去编写代码,那只能设计标准。
因为数据库厂商太多了,有oracle,mysql,sql server,db2…,如果你的数据库厂商的数据库产品想要和我Java程序连接,那么就必须遵循我的标准。
后续:如何声明接口?
使用者如何去实现接口?

二、接口能做什么,怎么用(声明和实现)

1、如何声明接口?
接口的语法格式,非常简单跟声明类相似,只是把class 变成了interface
[权限修饰符] interface 接口名{
接口成员列表;
}
下面我们看实例,就拿上面我们举例的来看
Bird类
Plane类
Kite类
2、接口的成员
JDK1.8之前:只能有两种成员
(1)全局的静态的常量:public static final,而且这三个单词可以省略
为什么只能是常量?因为标准中,只能写定死的
在这里插入图片描述
在这里插入图片描述

(2)公共的抽象的方法:public abstract,而且这两个单词可以省略
为什么只能是抽象方法?
标准中只规定有什么行为标准,行为特征。至于你怎么实现,那么你自己说了算。
在这里插入图片描述

三、 如何实现接口?

语法格式:

【修饰符】 class 实现类 implements 父接口们{
}
三、接口的特点
1、接口是标准,就是用来被遵守的,即就是用来被实现的,那么要求实现类在实现接口时,必须实现/重写所有的抽象方法,否则这个实现类就得是一个抽象类。

在这里插入图片描述
2、接口也是不能直接创建对象的
在这里插入图片描述
因为如果能创建对象的话,就可以调用抽象方法了,而抽象方法又没有方法体,你细品
其实初学者可以把接口看作比 抽象类 还要抽象的一种类型

3、接口类型的变量与实现类的对象构成多态引用
在这里插入图片描述
在这里插入图片描述
这样其实接口就统一管理了一群没有继承关系的类,他们都是使用了这个接口而已

4、一个类继承父类时,我们说Java只支持单继承,但是一个类在实现接口时,可以同时实现多个接口
在这里插入图片描述

5、一个类如果同时继承父类,又实现接口时,要求继承在前,实现在后
【修饰符】 class 实现类 extends 父类 implements 父接口们{
}

6、在Java中,接口还可以继承接口
【权限修饰符】 interface 子接口 extends 父接口们{
}
在这里插入图片描述
自己敲一敲,体会原理,只有懂得了原理后面才能找到方向
完整代码如下:

public class TestInterfaceDefineAndUse {
	public static void main(String[] args) {
//		Flyable f = new Flyable();//接口不能直接创建对象的
		Flyable[] sky = new Flyable[3];
		//数组的元素类型Flyable类型,是接口类型
		sky[0] = new Bird();//多态引用
		sky[1] = new Plane();
		sky[2] = new Kite();
		
		for (int i = 0; i < sky.length; i++) {
			//数组的元素类型Flyable类型,是接口类型
			sky[i].fly();
		}
	}
}
//声明一个Flyable接口
interface Flyable{
//	public static final long MAX_SPEED = 7900000;
	long MAX_SPEED = 7900000;
	
//	public abstract void fly();
	void fly();
}
//声明一个Jumpable接口
interface Jumpable{
	void jump();
}
class Animal{
	
}
//让小鸟继承Animal,并实现Flyable和Jumpable
class Bird extends Animal implements Flyable,Jumpable {

	//重写接口的抽象方法,实现接口的抽象方法
	@Override
	public void fly() {
		System.out.println("小鸟振翅高飞");
	}

	@Override
	public void jump() {
		System.out.println("双脚跳");
	}
	
}
class Plane implements Flyable{

	@Override
	public void fly() {
		System.out.println("靠发动机带动飞行");
	}
	
}
class Kite implements Flyable{

	@Override
	public void fly() {
		System.out.println("靠人放");
	}
	
}

interface A{
	void a();
}
interface B{
	void b();
}
interface C extends A,B{
	void c();
}
class Impl implements C{

	@Override
	public void a() {
	}

	@Override
	public void b() {
	}

	@Override
	public void c() {
	}
	
}

四、接口练习:

需求如下:
(1)声明一个接口MyRunnable,包含抽象方法void run()
(2)声明它的实现类Car,实现MyRunnable接口,自己随便打印点什么
(3)声明它的实现类Person,实现MyRunnable接口;声明它的实现类Dog,实现MyRunnable接口
(4)在测试类中创建MyRunnable[]数组,
元素赋值为各种实现类对象,遍历数组,调用元素的run()方法

在这里插入图片描述

package com.atguigu.test02.exer;
/*
 * 接口的练习1:
(1)声明一个接口MyRunnable,包含抽象方法void run()
(2)声明它的实现类Car,实现MyRunnable接口,自己随便打印点什么
(3)声明它的实现类Person,实现MyRunnable接口
(3)声明它的实现类Dog,实现MyRunnable接口
(4)在测试类中创建MyRunnable[]数组,元素赋值为各种实现类对象,遍历数组,调用元素的run()方法
 */
public class TestExer1 {
	public static void main(String[] args) {
		MyRunnable [] all=new MyRunnable[5];
		all[0]=new Car();
		all[1]=new Person();
		all[2]=new Dog();
		all[3]=new Car();
		all[4]=new Car();
		
		for (int i=0;i<all.length;i++){
			all[i].run();
		}
	}
}
interface MyRunnable{
	void run();
}
class Car implements MyRunnable{
	public void run(){
		System.out.println("我是Car");
	}
}
class Person implements MyRunnable{
	public void run(){
		System.out.println("我是Person");
	}
}
class Dog implements MyRunnable{
	public void run(){
		System.out.println("我是Dog");
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值