JAVA基础-接口

一、概述

  • 接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK
    7及以前),默认方法和静态方法(JDK 8),私有方法(JDK 9)。
  • 接口的定义,它与定义类方式相似,但是使用 interface 关键字。它也会被编译成.class文件,但一定要明确它并
    不是类,而是另外一种引用数据类型
    引用数据类型:数组,类,接口。
    定义格式
public interface 接口名{
    //默认方法      public default
    //静态方法      public static
    //私有方法      private
    //抽象方法      public abstract
}

1.1 默认方法 default

  • 接口的默认方法 可以通过通过实现类对象调用
  • 接口的默认方法,可以覆盖重写
public default 返回值类型 方法名称(参数){

    方法体
    
}

1.2 静态方法 static

  • 接口的默认方法,通过接口名直接访问
public static 返回值类型 方法名称(参数){
    方法体

}

1.3 私有方法 private

  • 接口的私有方法,只能在接口内访问

1. 普通私有方法

解决多个默认方法(同一个接口)之间代码重复问题

private 返回值类型 方法名(){
    方法体
}

2. 静态私有方法
解决多个静态方法(同一个接口)之间代码重复问题

private static 返回值类型 方法名(){
    方法体
}

1.4 抽象方法

  • 接口的抽象方法,必须在实现类中覆盖重写

修饰符必须为 public abstract(可以省略不写)

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

1.5 接口的“常量”

public static final 数据类型 常量名 = 数据值
//必须使用 public static final 修饰

public interface MyInterfaceConst {

    //一旦赋值 无法改变
    //必须赋值
    //大写 下划线
    public static final int NUM_OF = 10;
}

1.6 实现类格式 implements

public class 类名 implements 接口名 {

// 重写接口中抽象方法【必须】
// 重写接口中默认方法【可选】

}

1.7 接口的多实现

  • 在继承体系中,一个类只能继承一个父类。而对于接口而言,一个类是可以实现多个接口的,这叫做接口的多实现。并且,一个类能继承一个父类,同时实现多个接口。
public class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... {
// 重写接口中抽象方法【必须】
// 重写接口中默认方法【不重名时可选】
}

多实现中 静态方法重名

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

多实现中 默认方法重名

  • 必须在实现类中重写一次

多实现中 抽象方法重名

  • 必须在实现类中重写一次

多实现中 优先级问题

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

1.8 接口的多继承

  • 子接口继承(extends)父接口的方法。如果父接口中的默认方法有重名的,那么子接口需要重写一次。

  • 子接口重写默认方法时,default关键字可以保留。

  • 子类重写默认方法时,default关键字不可以保留

注意事项

  • 接口没有静态代码块和构造方法 (不能创建对象)

二 、补充

接口作为成员变量

public interface Skill {
    //释放技能的抽象方法
    public abstract void use();
}

public class Hero {
    private String name;
    private Skill skill;

    public Hero() {
    }

    public Hero(String name, Skill skill) {
        this.name = name;
        this.skill = skill;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Skill getSkill() {
        return skill;
    }

    public void setSkill(Skill skill) {
        this.skill = skill;
    }
}

public class Demo04Main {
    public static void main(String[] args) {
        Hero hero = new Hero();
        hero.setName("杨戬");


        //使用匿名内部类创建Skill类型的变量
        //也可以用接口的实现类
        Skill skill = new Skill() {
            @Override
            public void use() {
                System.out.println("biu~biu~biu~");
            }
        };

        hero.setSkill(skill);
        
        System.out.print(hero.getName());

        //hero.getSkill()获取的是Skill对象的引用(地址)
        hero.getSkill().use();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值