javase -- 接口


接口.

interface

  • java中类不支持多继承,使用接口实现多重继承的效果

  • 开发中,类和接口是并列的两个结构

    • interface
  • JDK7及以前:只能定义全局常量和抽象方法

    • 全局常量:[public] [static] [final] type 常量名 = ...;
    • 抽象方法:[public] [abstract] returnType 方法名();
  • JDK8:除了定义全局常量和抽象方法外,还可以定义静态方法、默认方法

    interface A{
        //静态方法 这个静态方法只能通过接口调用
        public static void method1(){
            System.out.println("接口中的静态方法");
        }
        //默认方法 权限修饰符 只能是public 或 缺省
        //1、可以重写默认方法(就是要省略default关键字)
        //2、如果实现类的父类,也有这个同名同参的方法,在实现类没有重写这个方法的情况下默认,使用父类的方法,不用接口中的默认方法 --> 类优先
        //3、如果有多个接口中默认方法同名同参 --> 爆红 ,那么必须重写该默认方法
        public default void method2(){
           System.out.println("接口中的默认方法"); 
        }
    
        public static void main(String[] args){
            A a = new A(){
              //匿名实现类  
            };     
            a.method2();//接口中的默认方法
            //a.method1();//爆红 接口 A 的静态方法只能以 A.method1 方式访问
            A.method1();//接口中的静态方法
    
        }
    }
    

    在实现类的非静态方法中调用这两种方法

    之前 通过实现类的对象调用这个默认方法,现在使用 接口.super.默认方法()调用

    class B implements A{
        //用于调用接口中的方法
        public void method() {
            A.method1();//静态方法
            A.super.method2();//默认方法
        }
    }
  • 接口中不能定义构造器,不可实例化

  • java开发中,接口都是通过类实现

    • class A implements I{}
  • 若实现类,重写了接口所有的抽象方法实现类才可以实例化

  • 若实现类,没有完全重写接口所有的抽象方法,则这个实现类就是抽象类

  • 类可以实现多个接口 —- 弥补了单继承的局限性

    • class A extends B implements I1,I2...{}
  • 接口存在继承,但是只能继承接口,且是多继承

    • interface I extends I1,I2,...{}
  • 接口的具体使用,体现多态性

    • 接口 i = new 实现类();
  • 接口,实际上可以看做是一种规范

  • 也存在匿名实现类

    public interface InterfaceTest {
        void run();
        public static void main(String[] args) {
            //接口的匿名实现类的匿名对象
            new InterfaceTest() {
                @Override
                public void run() {
                    // TODO 自动生成的方法存根
    
                }
            };
        }
    }
    

拓展.

(父类)属性与(接口)常量重名.

怎么调用

//1
interface A{
    int x = 1;
}
class B{
    int x = 2;
}
// 同时 继承B和实现A接口
public class C extends B implements A{
    int x = 3; // x = 3替换了 B.x 和 A.x 
    //但是如果注释掉 上面的语句,会导致 字段 x 有歧义(类B 和 接口A同级的)
    public void printX() {
        System.out.println(x); // C : 3
        System.out.println(super.x);// B : 2
        System.out.println(A.x);// A : 1
    }
    public static void main(String[] args){
          new C().printX();
    }
}
//2
interface A{
    int x = 1;
}
class B{
    int x = 2;
}
// 只实现 接口A 看 x 的值
public class C implements A{
    //int x = 3;
    public void printX() {
        System.out.println(x); // A : 3
        System.out.println(A.x);// A : 3
    }
    public static void main(String[] args){
          new C().printX();
    }
}

不同接口的抽象方法同名同参.

interface A{
    void run();
}

interface B{
    void run();
}

public class C implements A,B{
    @Override
    public void run(){
        // 一次重写 两个接口的方法
    }
}

父类和接口的方法同名同参.

interface A{
  void run();
}
class B{
   public void run() {
       System.out.println("父类方法");
   }
}
//不会报红 --> 上面的类优先原则 当接口和父类中方法同名同参 在子类没有重写父类的方法的情况下,优先使用父类的方法 这个方法 又相当于重写了接口中的抽象方法 所以没有爆红
public class C extends B implements A{

}

.

  • 接口不是一种类,而是对类的一组需求描述
  • 接口与类是并列关系,或则可以理解为一种特殊的类,从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义(JDK7.0及之前),而没有变量和方法的实现。

文章作者: liuminkai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liuminkai !
评论
 上一篇
javase -- 抽象类与接口的异同 javase -- 抽象类与接口的异同
抽象类与接口的异同.相同点. 都不能实例化 都需要类去实现 不同点. 接口不能有构造方法,抽象类可以有。 一个类可以实现多个接口,一个抽象类只能别一个类继承 接口不能有方法体,抽象类可以有。(JDK1.7及以前) 接口不能有静态方法,抽象
2020-07-30
下一篇 
javase -- 模板方法设计模式 javase -- 模板方法设计模式
模板方法设计模式(抽象类的应用).解决的问题. 当功能(方法)内部一部分实现是确定的,一部分实现是不确定的(易变的)。这时可以把不确定的部分暴露出来,让子类去实现 常用 数据库访问的封装 Junit单元测试 JavaWeb的Servlet中
2020-07-30
  目录