zoukankan      html  css  js  c++  java
  • javaSE笔记-接口

      接口不能创建对象,但是可以被实现(`implements` ,类似于被继承)。一个实现接口的类(可以看做是接口的子类),需要实现接口中所有的抽象方法,创建该类对象,就可以调用方法了,否则它必须是一个抽象类。

    接口:是功能的集合(接口中定义的都是方法)

    定义接口使用的也是.java文件;编译生成的也是.class文件

    定义接口使用关键字interface

    修饰符 interface 接口名 {

       抽象方法;

       默认方法; (JDK8以后新增)

       静态方法; (JDK8以后新增)

    }

    接口的使用:

       1.接口不能创建对象使用

      2.可以定义一个实现类,实现(继承)接口,重写接口中的抽象方法,创建实现类对象使用

     

    抽象方法:没有方法体,被abstract修饰的方法

      默认的修饰符public abstract可以省略

       public abstract 返回值类型 方法名(参数);

     

        注意:
          接口中的抽象方法修饰符是可以省略不写,不写默认也是public abstract

          建议写出,增强阅读性

    public interface MyInter {
        //定义抽象方法
        public abstract void show01();
    
        public abstract int show02();
    
        void show03(String s);
    }

      定义接口的实现类

        使用格式:使用类实现接口,重写接口中的抽象方法

          public class 实现类名 implements 接口{

            重写接口中的抽象方法;

          }


        注意:

          实现类似于继承,类实现接口,就可以继承接口中的所有非私有的成员

    public class MyInterImpl implements MyInter{
        @Override
        public void show01() {
            System.out.println("实现类重写接口中的show01抽象方法!");
        }
    
        @Override
        public int show02() {
            System.out.println("实现类重写接口中的show02抽象方法!");
            return 0;
        }
    
        @Override
        public void show03(String s) {
            System.out.println("实现类重写接口中的show03抽象方法!"+s);
        }
    }
    public class Demo01MyInter {
        public static void main(String[] args) {
            //接口不能创建对象使用 'MyInter' is abstract; cannot be instantiated
            //MyInter mi = new MyInter();
    
            //创建接口的实现类对象
            MyInterImpl my = new MyInterImpl();
            my.show01();
            my.show02();
            my.show03("赵四");
        }
    }

    默认方法

        定义格式:

          修饰符 default 返回值类型 方法名(参数){

            方法体;

          }

          注意:

            默认方法的修饰符default不能省略

    public interface MyInter {
        public default void show01(){
            System.out.println("MyInter接口中的默认show01方法");
        }
    
        public default  void show02(){
            System.out.println("MyInter接口中的默认show02方法");
        }
    }

     

      1. 含有默认方法的接口的使用:定义实现类,实现接口,选择性的重写默认方法,创建实现类对象使用
      2. 重写了默认方法:使用实现类重写后的方法
      3. 没有重写默认方法:使用继承自接口中的默认方法

        注意:

          实现类重写接口中的默认方法,去掉default修饰符

    public class MyInterImpl implements MyInter{
        @Override
        public void show01() {
            System.out.println("实现类重写了MyInter接口中的show01默认方法");
        }
    }
    public class Demo01MyInter {
        public static void main(String[] args) {
           //创建接口的实现类对象
            MyInterImpl my = new MyInterImpl();
            my.show01();//实现类重写的
            my.show02();//继承自接口的
        }
    }

    静态方法

        定义格式:

          修饰符 static 返回值类型 方法名(参数){

            方法体

          }

          注意:

          • 定义静态方法不能省略static关键字
          • 定义含有静态方法的接口使用:
          • 静态成员属于类(接口),所以可以通过接口名.方法名(参数)直接使用

     

    public interface MyInter {
        public static void show01(){
            System.out.println("MyInter接口的静态show01方法");
        }
    
        public static String show02(int a){
            System.out.println("MyInter接口的静态show01方法"+a);
            return "哈哈";
        }
    }
    public class MyInterImpl implements MyInter{
        //@Override//Method does not override method from its superclass
        public static void show01(){
            System.out.println("MyInterImpl类的静态show01方法");
        }
    }

        静态方法只能使用接口名调用,不可以通过实现类的类名或者实现类的对象调用

        静态方法是不能重写的,属于类|接口本身,也不能被实现类继承使用。在实现类中定义了静态方法,属于实现类本身

    public class Demo01MyInter {
        public static void main(String[] args) {
            //通过接口名.方法名(参数)调用接口中的静态方法
            MyInter.show01();
            String s = MyInter.show02(10);
            System.out.println(s);
    
            MyInterImpl.show01();
        }
    }

    接口的多实现

      语法

        class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... {

          // 重写接口中抽象方法【必须】

          // 重写接口中默认方法【不重名时可选】

        }

      抽象方法

        接口中,有多个抽象方法时,实现类必须重写所有抽象方法。如果多个接口中抽象方法有重名的,只需要重写一次。

      默认方法

        接口中,有多个默认方法时,实现类都可继承使用。如果默认方法有重名的,必须重写一次。

      静态方法

        接口中,存在同名的静态方法并不会冲突,原因是只能通过各自接口名访问静态方法。

      优先级的问题

        当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。

    接口的多继承

    • 接口的继承使用 `extends` 关键字,子接口继承父接口的方法。如果多个父接口中的默认方法有重名的,那么子接口需要重写一次
    • 子接口重写默认方法时,default关键字可以保留。
    • 子类重写默认方法时,default关键字不可以保留。

    其他成员的特点

      - 接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰。

      - 接口中,没有构造方法,不能创建对象。

      - 接口中,没有静态代码块。

    抽象类和接口

      • 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口, 接口弥补了Java的单继承
      • ​抽象类为继承体系中的共性内容, 接口为继承体系中的扩展功能
  • 相关阅读:
    ICONS-图标库
    图形资源
    vue项目中,如果修改了组件名称,vscode编辑器会在引入修改组件的名字处提示红色波浪线 The file is in the program because:Imported via xxx Root file specified for compilation .
    接口在dev环境报跨域问题(has been blocked by CORS policy:Response to preflight request doesn't pass access control check:No 'Access-Control-Allow-Origin' header ispresent on the requested resource.),qa环境正常
    阿里云occ的图片文件URL用浏览器直接打开无法访问,提示This XML file does noe appear to have any style information associated with it. The document tree is shown below.
    vue 项目使用element ui 中tree组件 check-strictly 用法(父子不互相关联的反显情况)
    高德地图进行线路规划绘制标记点操作(vue)
    vue中实现拖拽调整顺序功能
    2021-01-22 浏览器相关知识
    2021-01-22 js 相关知识点
  • 原文地址:https://www.cnblogs.com/love-xiaowu/p/12688944.html
Copyright © 2011-2022 走看看