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的单继承
      • ​抽象类为继承体系中的共性内容, 接口为继承体系中的扩展功能
  • 相关阅读:
    上帝永远不会问你的十件事
    discuz x1.5 showmessage函数和showDialog函数解析
    人生,没有那么简单…
    Proxy代理对象是如何调用invoke()方法的.
    实现简单的AOP前置后置增强
    浅谈设计模式visitor访问者模式
    了解jsp,这一篇就够了.
    jsp之el表达式jstl标签
    orale数据库.实例.表空间.用户.表
    题解 UVa10892
  • 原文地址:https://www.cnblogs.com/love-xiaowu/p/12688944.html
Copyright © 2011-2022 走看看