一、声明是接口?
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");
}
}