Java接口

什么是接口?

接口技术是用来描述类具有什么功能,而并不是给出每个功能的具体实现。

接口中的所有方法自动的属于public。

在接口中可以定义常量(自动定义为public static final),但是没有实力域。

接口的常量调用,直接接口名.常量名。

 

Java8中接口新增了静态方法和默认方法:

静态方法:Java8中,允许在接口中增加静态方法,但是这有违于将接口作为抽象规范的初衷。

目前为止,通常的做法是将静态方法放在伴随类中。在标准库中,你会看到成对出现的接口和使用工具类,如Collection/Collections或Path/Paths。

默认方法:Java8允许给接口添加一个非抽象的实现方法,只需要使用default关键字即可。这个方法又叫做扩展方法。默认方法和抽象方法的区别在于默认方法可以重写方法,也可以选择直接调用接口中的default方法。

优缺点:确保对Java8之前项目的兼容性,可以在不破坏代码的基础上扩展原有库的功能。但从另一方面,使接口作为协议,类作为实现的界限变得模糊了。

 

解决方法冲突:

多继承很容易会出现方法名一样的情况,java是怎么解决这种冲突的呢?

1)超类优先,如果超类提供了一个具体方法,同名且有相同参数类型的默认方法就会被忽略。

2)接口冲突,如果一个超接口提供了一个默认方法,另一个接口提供了一个同名且参数类型(不论是否是默认参数)相同的方法,必须覆盖这个方法来解决冲突。Java编译器会直接报告一个错误,让程序员来解决这个二义性——重写方法或者选择其中的某一个。

public interface TestInterface {
    default void print(){
        System.out.println("这是接口test中的print方法+++++++++");
    }
}

public interface TestInterface01 {
    default void print(){
        System.out.println("这是接口test01的print方法1111111");
    }
}

public class Test implements TestInterface,TestInterface01 {
    @Override
    public void print() {
        TestInterface.super.print();
    }
}

public static void main(String[] args) {
        Test test=new Test();
        test.print();
}

输出结果:

       

Cloneable接口:这个接口指示一个类提供了一个安全的clone方法。

克隆:copy一个初始状态和当前被克隆原对象数据一致的新对象。

浅克隆:copy所有的数据域,但不包括对象中引用的子对象。

深克隆:copy所有的数据,包括引用的子对象。

问题:

默认的克隆是浅克隆,并没有克隆对象中引用的其他对象。浅克隆会带来什么影响呢?这要看具体情况。如果原对象和浅克隆对象共享的子对象是不可变的,那么这种共享是安全的。如String,就是final类,没有更改器方法会改变它。不过,通常子对象是可变的,这种情况下,没有对子对象进行引用的拷贝,那么克隆对象和原对象共享一个子对象,修改克隆对象会直接修改原对象的数据,不安全,必须重新定义clone方法来建立一个深拷贝,克隆所有子对象。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值