JAVA之定义接口的语法规则

接口(接口的作用非常的丰富,往往和设计模式结合在一起的):

  • 概念:可以认为接口是一种“彻底”的抽象类,接口是从多个相似的类中抽取出来的一种规范,接口的体现是规范(通信规范),如主板上各种不同类型的“插槽”,无论哪个厂商,无论哪个型号的主板,它们都可以与CPU、显卡、内存进行数据通信——因为国际上有一套公开的“标准”(规范),就是通过接口体现出来。
  • 定义的语法:
    【修饰符】 interface 接口名
    {
        //0 ~ N个Field定义
        //0 ~ N个抽象方法
        //0 ~ N个内部类、内部接口、内部枚举定义
    }

    注意:

  1. 接口不能有构造器、初始化块;

  2. 修饰符可以为:public或省略;不能使用static修饰、不能用final(不允许有子类)修饰、不用abstract;

  3. 接口名:多个单词连缀而成,每个单词的首字母大写,推荐接口用“形容词”,在有些地方(c#),推荐接口以I开头,后来有些Java程序员也用这种方式,【接口里的成分,都是public,因为接口体现的时公开的标准】;

  4. 接口里的Field,默认有3个修饰符:public、static、final,无论写还是不写,反正都有【接口里的Field,声明时必须指定初始值,因为final修饰的类变量只能在声明时,静态初始化中指定初始值,又由于接口不包含初始化块,所以只能在声明时指定初始值】;

  5. 接口里的方法,默认有2个修饰符:public、abstract,无论写还是不写,反正都有【接口里的方法不可能是static,因为接口里的方法默认有abstract修饰】;

  6. 接口里的内部类、内部接口、内部枚举,默认有2个修饰符,public、static,无论写还是不写,反正都有;

  7. abstract和static不能同时修饰方法、abstract与private不能让同时修饰方法、abstract与final不能同时出现,二者永远互斥;

  8. 一个接口可以有N个直接父接口。有了接口之后,接口可以用于定义变量,接口不可以创建实例,接口最大的用途就是供其他类实现自己;

  9. implements实现一个或者N个接口,当一个类实现接口之后,实现类要么为抽象父类的所有抽象方法提供实现,否则你的子类也只能是抽象类;

    扫描二维码关注公众号,回复: 10581776 查看本文章
  10. 接口主要在“面向接口编程”时候,提供更灵活的机制
interface A
{
}
interface B
{
}
interface C
{
}
//一个接口,可以拥有N个直接的父接口
public interface D extends A,B,C
{
}
interface Eatable
{
    void eat();
}
interface Flyable
{
    void fly();
}

public interface Walkable extends Eatable
{
    int AGE = 20;
    //对于执行“宏替换”,变量名应该是多个单词连缀而成,并且所有字母全部大写,单词与单词之间以下划线隔开
    final String MY_NAME = "张三";
    //接口里的成分只能用public修饰,可省略
    double weight = 34.4;

    //方法前面默认有public abstract修饰。
    void info();
    //方法前面默认有abstract修饰,所以方法后面坚决不能有花括号
   // void test(){}             //错误
}

//一个类可以同时“实现”N个接口
public class Sparrow implements Flyable, Walkable
{
    @Override
    public void eat()
    {
        System.out.println("麻雀一口一口地吃麦子");
    }
    public void fly()
    {
        System.out.println("麻雀在天空飞翔");
    }
    public void info()
    {
        System.out.println("我是一只小麻雀");
    }

    public static void main(String[] args)
    {
    	//向上转型
        Walkable w = new Sparrow();
        //w引用变量,在编译时只是Walkable类型
        //因此,编译器只能允许调用Walkable里的方法
        w.eat();          //麻雀一口一口地吃麦子
        w.info();         //我是一只小麻雀
        
        //强转,向下转型
        Sparrow sp = (Sparrow) w;
        sp.eat();         //麻雀一口一口地吃麦子
        sp.fly();         //麻雀在天空飞翔
        sp.info();        //我是一只小麻雀
        
        Sparrow fy = new Sparrow();
        fy.fly();         //麻雀在天空飞翔
    }
}
  • 说明:
  1. 接口与抽象类之间的相似之处:都可以包含抽象方法;都不能创建实例;子类继承抽象类,实现接口,都要求实现所有的抽象方法,否则子类也只能是抽象类
  2. 接口与抽象类之间的区别之处:接口里只能有抽象方法,但抽象类可以没有抽象方法,只包含普通方法;接口里不能定义静态方法,但抽象类可以包含静态方法;接口里的Field总是有public、static、final,但抽象类中的Field完全可以是最普通的Field;接口不能包含构造器,但抽象类完全可以有构造器;接口不能包含初始化块,但抽象类完全可以有初始化块;接口可以有多个直接的父接口,但抽象类只能有一个直接父类。

发布了111 篇原创文章 · 获赞 57 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_38358499/article/details/100600212