Java中的接口

一:接口定义

1:语法格式

定义接口使用interface修饰符。

[修饰符] interface 接口名{
//接口成员
}

实现接口使用implement关键字。

public 类名 implement 接口名{
    实现方法
    普通方法
    属性
}

一个类可以实现多个接口,各接口之间用逗号分隔。

接口的实现类允许包含普通方法。

在实现抽象方法时需要指定public权限,否则会产生编译错误。

实现接口的类必须实现接口中所定义的所有抽象方法,即使这个类中不使用,也要实现。通常用空方法体实现子类不需要的抽象方法。如果是有返回值的,就让其返回默认值。

2:实例

public interface USBInterface {
    public static final String NAME = "";  //静态常量
    public void service();
}

接口中的方法默认是抽象方法,所以可以省略abstract修饰符。

接口中的方法默认都是由public修饰的,所以可以省略public;

接口中的变量只能是静态变量(static final),所以可以省略static final。

且静态变量在定义时就需要赋值,且不可变。

二:JDK8.0中接口的新特性:

1:default方法

在 jdk8.0 中 default 关键字可用于在接口中修饰方法(默认方法), default 修饰的方法可以有具体实现,也只能在接口中出现。 default 修饰的方法可以被重写。 默认方法可以在不破坏已经在使用该接口的所有代码。默认方法有时也称为防御方法

2:static方法。

static修饰的方法称为静态方法。static方法使用接口名.方法直接调用。即使是这个接口被另外一个接口继承时,这个方法也不能被调用。

三:抽象类和接口的区别:

1:继承 抽象类只能单继承,而接口可以实现多继承。

2:实现 抽象类中,子类通过使用extends继承抽象类。在接口中,子类通过implements实现多个接口。

3:成员 抽象类中可以有实例成员,静态成员和抽象方法,抽象类中的成员方法不能用default来修饰。

在接口中,只能有常量,抽象方法。以及在JDK8.0版本以后可以有static和default方法。

4:成员变量修饰符 抽象类中可定义变量,也可定义常量。接口中只能定义常量(public static final 修饰的变量)

5:构造函数 抽象类可以有构造函数。接口中不能定义构造函数。

6:最高层 类的最高层是Object。接口没有最高层。

7:访问权限 接口中默认是public修饰的,public可以省略。 抽象类可以为protected或包访问修饰符。

8:相同点 两者都不能实例化。两者都是引用类型。两者都可以包含抽象方法。

四:lambda方法

接口中有一种特殊的接口,这类接口中只有一个抽象方法。我们把这种接口称为函数式接口(FunctionalInterface) 可以使用 @FunctionalInterface 标记函数接口 函数接口表示某个功能(能力)

函数式接口的匿名类写法可以使用 lambda来简写.

@FunctionalInterface
interface IType {
    void test();
}
class Demo{
    public static void main(String[] args){
        // 通常使用 匿名类
        IType a = new IType(){
           @Override
           public void test(){
               // 实现
           }
        };
        
        // lambda
        IType b = () ->{
            // 实现
        };
    }    
}

如果lambda中实现只有一句代码则可以省略 {} 这种写法java可以根据变量的类型推断出匿名类实现的接口,以及重写的方法。 方法写法上:

  • 如果方法没有参数则使用 ()表示。
  • 如果有参数, 则需要在()写形参列表,在实现中可以使用这些参数。
    • 参数的类型可以省略,可以推断出参数类型
    • 如果只有一个参数则 () 可以省略

五:克隆

1:浅克隆

对象中的引用数据类型的字段是同一个引用 [默认]


    @Override
    public Dog clone() throws CloneNotSupportedException {
        return (Dog) super.clone();
    }

2:深克隆

将对象中的引用数据类型也复制一份

@Override
    protected Person clone() throws CloneNotSupportedException {
//        return (Person) super.clone();
        Person copy = (Person) super.clone();
        // 将引用数据类型 clone 一份, 再设置
        Dog copyDog = copy.getDog().clone();
        copy.dog = copyDog;

        return copy;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值