接口——接口的由来:当一个抽象类中 所有的函数都是抽象的时候,那么我们就可以将这个抽象类
用另外一种表现形式-接口
在JDK7之前 接口中是不可以定义具体函数的
在JDK8以后 接口中是可以定义具体函数的(必须是静态的函数 成员函数还是依旧默认抽象的)
对于接口而言 里面的函数 变量
所有的接口变量:
public static final xxx xxx
所有的函数:
public abstract xxx xxx
类与类之间是什么关系
单继承 一个类只能且只有一个父类
接口与类之间是什么关系
实现关系
一个类可以实现多个接口 implements
接口与接口之间是什么关系
不可能是实现关系implements
只能是继承关系-多继承
为什么类与类之间不能多继承?
为什么接口与接口之间可以多继承?
本质就看 函数是否有函数体!
具体的代码实现:
package com.day.test01;
public class InterfaceDemo01 {
public static void main(String[] args) {
Demo4 d4=new Demo4();
System.out.println(d4.age);
d4.show();
//d4.haha();//调用不到接口的静态函数
interfaceA.haha();//只能通过接口调用静态函数
}
}
interface interfaceA{
int age=10; //public static final int age=10;
void show();//public abstract void show();
//只能是通过接口调用 不会继承给子类
public static void haha(){
System.out.println("哈哈");
}
}
class Demo4 implements interfaceA{
@Override
public void show() {
System.out.println("Demo04 show....");
}
}
interface interfaceB{
void show();
}
interface interfaceC{
void haha();
}
/*
一个类可以多现实多个接口=其实就是相当于继承多个抽象类
本质上还是子类与父类的关系 只不过在接口这里 一个类可以有多个接口爸爸
当一个类想要实现一个接口的时候 有两个选择
1.重写接口中的函数
2.该类定义成抽象即可
*/
class Demo1 implements interfaceB,interfaceC{
@Override
public void haha() {
}
@Override
public void show() {
}
}
//The type Demo must implement the inherited abstract method interfaceC.haha()
abstract class Demo2 implements interfaceB,interfaceC{
/*
public abstract void show();
public abstract void haha();
*/
}
interface interfaceD{
void happyLife(); //你爷爷希望你生活美好
public static void show(){
System.out.println("D show...");
}
}
interface interfaceE{
void happyLife(); //你奶奶希望你生活美好
public static void show(){
System.out.println("F show...");
}
}
//继承到的是属性 抽象函数 但是没有静态函数的继承
interface interfaceF extends interfaceD,interfaceE{
//你爸爸希望你生活美好
}
class Demo3 implements interfaceF{
@Override
public void happyLife() {
}
}
常用的三个接口:Comparable、Iterable、Serializable
package part01.接口;
//第一个作用:在后期对类的功能进行扩展,这些功能并不是该类原先所具有的功能!
//这样子的话 就避免了继承带来的一些弊端 只能单继承
/*
Java当中最常用的三个接口 内置的接口
Comparable 比较接口 给我们的类提供比较的功能
int compareTo(T o); 按照自然顺序进行比较
String.compareTo()
Iterable 可迭代接口 可以将我们该类的对象用于foreach循环
Serializable 序列化接口 我们可以将该对象的数据写出去
对象的数据在内存中 如何将内存中的数据写出去(硬盘 网络)
想要把内存中的数据提取 就得实现序列化接口
*/
public class InterfaceDemo02 {
public static void main(String[] args) {
String s="abc";
}
}
//缉毒 导盲 防爆
interface 缉毒{
void jidu();
}
class Dog implements 缉毒{
@Override
public void jidu() {
System.out.println("可以去缉毒了!");
}
}
class Bird{
void fly(){}
}
interface 飞行{
void fly();
}
class Person implements 飞行{
@Override
public void fly() {
System.out.println("人可以飞了....");
}
}
接口的作用:
package part01.接口;
//第二作用:向外提供统一的规范
//接口的出现 一定程度上对我们的代码设计进行了解耦
//耦合性-两只之间的联系
public class InterfaceDemo03 {
public static void main(String[] args) {
Computer computer=new Computer();
Mouse mouse=new Mouse();
KeyBoard keyBoard=new KeyBoard();
MobileHard mobileHard=new MobileHard();
computer.getUSBConnect(mouse);
computer.getUSBConnect(keyBoard);
computer.getUSBConnect(mobileHard);
}
}
class Computer{
public void getUSBConnect(USB device){
device.doSomething();
}
}
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("键盘:提供数据的输入。。。。");
}
}
class MobileHard implements USB{
@Override
public void doSomething() {
System.out.println("移动硬盘:提供外部存储。。。。");
}
}
package com.day.test01;
//第三个作用:传递代码 和第二个很像
public class InterfaceDemo04 {
public static void main(String[] args) {
Button loginButton=new Button();
Button registButton=new Button();
Button downloadButton=new Button();
//匿名实现子类的匿名对象
//避免了在编译期间所生成的大量备选的类字节码
//在程序运行期间 需要用到了 再去创建实现子类和其对象即可
/*
实现子类的匿名对象 之所以写Mission的原因就在于我们要确定子类是谁的实现子类
new Mission()
匿名实现子类
{
public void doTask() {
System.out.println("登录功能......");
};
}
*/
//了解Android开发-增加知识量 为了毕设
loginButton.doSometing(new /*LoginMission()
class LoginMission implements*/ Mission(){
@Override
public void doTask() {
System.out.println("登录功能......");
}
}
);
registButton.doSometing(new Mission(){
public void doTask() {
System.out.println("注册功能......");
};
}
);
downloadButton.doSometing(new Mission(){
public void doTask() {
System.out.println("下载功能......");
};
});
}
}
//按钮---任务 分开看
interface Mission{
//任务的具体内容
public void doTask();
}
class Button{
//当用户点击该按钮的时候 应该触发的一些事情
//每一个按钮对象的任务不同 此处无法决定具体的代码
public void doSometing(Mission mission){
mission.doTask();
}
}