package com.day29.test;

public class Test {
        public static void main(String[] args) {
            System.out.println("接口");
            // 有的时候要多继承父类 
            // 但是java只支持单继承
            // 所以有了接口 就可以实现 多继承这个状态
            // 但是接口 子类 不能叫继承接口 而是叫 实现接口
            //而他们之间不是子父的关系 
            // 而是有一些共同特征
            // 例如 鼠标 键盘 打印机 等等 都支持USB链接
            // 接口是一种规范 定义的是一种规则
            // 体现了现实世界中 如果你是 ... 则必须能...的思想
            // 继承是一个是不是的关系 而接口实现则是 能不能的关系
            // 接口本质是锲约 标准 规范 就像我们的法律一样 
            //  制定好后大家都要遵守
            // 接口 举例
            //  可以飞      攻击性
            // 
            // 飞机 子弹  风筝 热气球  这些都可以飞
            //  但是 子弹 既可以飞 也有攻击性 
            //  接口的扩展性更强 
            
            //测试接口的功能
            Plane plane=new Plane();
            plane.fly();
            
        }
}

//接口的定义
//1. 接口 使用 interface 定义
// 2.接口和类是并列的结构

//3.如何定义接口 : 定义接口的成员
// JDK7 及以前 :
//  只能够定义全局常量和 抽象方法
//  全局常量 public static final 
//  抽象方法: public abstract 
// JDK8 : 除了够定义全局常量和 抽象方法 还可以定义静态方法和默认方法

//4. 接口中是不可以定义构造器 意味着接口不能实例化

//5. 在java开发中 让类实现接口里的方法 使用关键字 implements 建立关系
// 如果实现类覆盖了接口中的所有抽象方法 则此类可以实例化
// 如果实现类中没有覆盖了接口中的抽象方法  此类必须定义为抽象类 abstract 
//  对于实现类中与接口建立关系后 实现类中实现接口中的方法
// 我们更习惯叫他 '实现方法'
// 对于继承了抽象类 子类去实现抽象类中的抽象方法 
// 我们一般叫做 '重写方法'

// 6. java 类中可以实现多个接口   弥补了 java的单继承的局限性 :下面 子弹类 举例说明

// 7. 接口和接口之间可以继承 而且可以多继承
//  类与类之间 叫做 继承
//  类与接口之间 叫做 实现
//  接口与接口之间 叫做 继承
// ********************************
// 8. 接口的具体使用 体现了多态性
// 9. 接口 实际可以看作一种规范
//
//  经典面试题: 抽象类与接口有哪些异同?
//  

interface Flyable{
    //全局常量 
    // 在接口定义中 public static final  这些可以省略 
    // 默认是存在的
    public static final int MAX_SPEED=7900;  //第一宇宙速度
    
    public static final int MIX_SPEED=1;
    
    //抽象方法
    public abstract void  fly();
    
    //  在接口定义方法 public abstract 也可以省略
    public abstract void stop();
    
}
//攻击性的类
interface Attackable{
    void attack();
}

//子弹类  实现了多个接口  
//如果又有继承 又有实现接口
// 写法 先继承 后 实现这中
class Bullet extends Object implements Flyable,Attackable{

    @Override
    public void attack() {
        // TODO Auto-generated method stub
        System.out.println("攻击");
    }

    @Override
    public void fly() {
        // TODO Auto-generated method stub
        System.out.println("飞");
    }
        
    

    @Override
    public void stop() {
        // TODO Auto-generated method stub
        System.out.println("停止");
        
    }
    
}
//飞机类
class Plane implements Flyable{
    
    

    //对于实现类中与接口建立关系后 实现类中实现接口中的方法
    // 我们更习惯叫他 实现方法 
    // 对于继承了抽象类 子类去实现抽象类中的抽象方法
    // 我们一般叫做 重写方法
    @Override
    public void fly() {
        // TODO Auto-generated method stub
        System.out.println("通过引擎起飞");
        
    }

    @Override
    public void stop() {
        // TODO Auto-generated method stub
        System.out.println("驾驶员 减速停止");
        
    }
    
}

//**********************

interface aa{
    
}

interface bb{
    
}
//cc 多继承了 aa ,bb 
interface cc extends aa,bb{
    
}


//为什么 要使用 接口这种规范来是设计程序

//例如
//现在java 去操作数据库 
//数据库种类有 mysql oracle sqlserver 等等
//在没有接口这种规范的时候 
//实际 Java 可以之间操作  mysql 或者是 oracle 
//如果 mysql 和 oracle 实现增删改查的方式不同 或者实现的方法名不同
//比如 
//mysql 实现插入数据操作方法  叫做 add
//oracle 实现插入数据操作 叫做方法 insert
//这样对于我们程序员来说 
// 如果今天你要去操作 mysql 你要去学习 mysql中的方法
// 如果明天你要去操作 oracle 你就要去学习oracle中的方法 
// 这样会非常的累 而且不好记住
// 所以在程序设计的时候 JAVA大神们就会利用 接口这种规范和面向对象的多态性  
// 把JAVA 去往各种数据库路上 架起了一个 桥梁(JDBC) 他们去定义数据库的规范 
//  然后数据库实现类 必须遵循这个规范来开发具体实现的方法
//  程序员在调用数据库就不必考虑到底是mysql 或者是oracle 
//  程序员直接在这个桥梁上按照规范调用方法 即可实现各种数据库的操作
// 这样对于调用数据库操作 大家只用记住接口定义的方法即可
// 无需再去一一学习底层数据库的操作 大大提高了开发效率
// java -> JDBC(这里封装了各种数据库操作的接口)-> oracle/ mysql /sqlserver 
// 数据库类中实现操作数据库的方法 必须按照接口的规范开发

//  (在定义规范的时候不清楚mysql/oracle 具体实现的逻辑 所以只能定义抽象方法 具体的实现通过‘数据库实现类’来实现 )  [多态的体现]
//    (我把规矩定在这边,在这里操作 必须都要遵守我的规范 )
//   (比如方法名 我规范 使用‘add’单词 命名插入操作)
//   (所有数据库实现具体方法必须都要按照我的规范声明)

//  在开发中体会  面向接口编程的思想