1.接口的由来:当一个抽象类中所有的函数都是抽象的时候,那么我们就可以将这个抽象类用接口来实现
2.在JDK7之前接口中是不可以定义具体函数的;在JDK8之后接口中是可以定义具体函数的--具体函数必须是静态的,成员函数依旧默认为抽象的
对于接口而言 里面的函数 变量:
所有的接口变量:public static final xxx xxx
所有的函数:public abstract xxx xxx
public class Demo01 {
public static void main(String[] args) {
}
}
//创建接口
interface interfaceA{
int age=10;//public static final int age=10;
void show();//public abstract void show();
public static void haha() {//具体函数必须是静态的
System.out.println("哈哈");
}
}
3.类与接口之间多实现的关系----一个类中可以多实现多个接口=其实相当于继承多个抽象类
本质上还是子类与父类的关系,只不过在接口这里,一个类可以有多个接口
4.当一个类想要实现一个接口时,有两个选择:
1.重写接口中的函数 Demo2
2.该类定义为抽象即可 Demo1
//接口之间是实现关系用 implements
interface interfaceB{
void show();
}
interface interfaceC{
void haha();
}
abstract class Demo1 implements interfaceB,interfaceC{
//并没有实现具体函数---用抽象abstract
public abstract void show();
public abstract void haha();
}
class Demo2 implements interfaceB,interfaceC{
@Override
public void haha() {
}
@Override
public void show() {
}
}
5.接口与接口之间(不可能是实现关系)只能是继承关系(多继承)
类与类之间为什么不可以多继承--本质就是因为函数是否有函数体
接口与接口之间为什么可以多继承?--接口里面的方法并没具体的函数体,具体操作是由当前实现类决定
interface interfaceD{
void show();
}
interface interfaceE{
void haha();
}
//继承到的是属性,抽象函数,但是没有静态函数的继承
interface interfaceF extends interfaceD,interfaceE{}
6.接口的作用:
(1)第一个作用:在后期对类的功能进行扩展,这些功能并不是该类原先所具有的功能;这样就避免了继承带来的弊端---只能 单继承
public class Demo02 {
public static void main(String[] args) {
Dog dog=new Dog();
dog.jidu();
}
}
//缉毒不是狗本身具有的行为
interface 缉毒{
void jidu();
}
class Dog implements 缉毒{
@Override
public void jidu() {
System.out.println("可以去缉毒了");
}
}
(2)第二个作用:向外提供统一的规范;接口的出现一定程度上对代码设计进行了解耦
package part01.接口;
/*
第二个作用:向外提供统一的规范
接口的出现一定程度上对代码设计进行了解耦
*/
public class Demo03 {
public static void main(String[] args) {
Computer computer=new Computer();
Mouse mouse=new Mouse();
KeyBoard keyBoard=new KeyBoard();
computer.getUSBConnect(mouse);
computer.getUSBConnect(keyBoard);
}
}
class Computer{
//连接USB
public void getUSBConnect(USB usb) {
usb.doSomething();
}
}
//创建USB接口
interface USB{
void doSomething();
}
class Mouse implements USB{
@Override
public void doSomething() {
System.out.println("鼠标:提供坐标的访问和控制");
}
}
class KeyBoard implements USB{
@Override
public void doSomething() {
System.out.println("键盘:提供数据的输入。。。。。");
}
}
(3) 第三个作用:传递代码
package part01.接口;
/*
第三个作用:传递代码
*/
public class Demo04 {
public static void main(String[] args) {
Button loginButton=new Button();
Button registButton=new Button();
Button downloadButton=new Button();
//匿名实现子类的匿名对象
//动态运行----避免了在编译期间所生成的大量的备选的类字节码
//在程序运行期间需要用到了再去创建时间子类和其对象即可
/*
实现子类的匿名对象--之所以写Mission的原因就在于我们要确定子类是谁的实现子类
new Mission()
匿名实现子类
{
@Override
public void doTask() {
System.out.println("登录功能。。。。");
};
}
*
*/
loginButton.doSomething(
new Mission() {
@Override
public void doTask() {
System.out.println("登录功能。。。。");
};
}
);
registButton.doSomething(
new Mission() {
@Override
public void doTask() {
System.out.println("注册功能。。。。");
};
}
);
downloadButton.doSomething(
new Mission() {
@Override
public void doTask() {
System.out.println("下载功能");
};
}
);
}
}
//按钮--任务分开来看
interface Mission{
public void doTask();
}
//Button是一个实体类---不能定义成接口
class Button{
//当用户点击该按钮的时候应该触发的一些事情
public void doSomething(Mission mission) {
mission.doTask();
}
}