Java篇(四)

目录

1.接口

概念

public

interface

implement

可扩展

作用

static

default

冲突

类优先

修改字符串排序方式

clone

2.lambda表达式


1.接口

概念

不是类,而是一组需求。可看作没有实例字段的的抽象类,区别在于可继承多个父类,或者未接线的键盘。可用instanceof检测。

public

所有方法默认public;所有字段默认为public static final。

interface

创建一个接口。接口名字可跟随一个泛型类型,如Comprable<T>,实现类不指定时默认Object。

implement

使用一个接口。不同于接口方法,实现接口时需加public。可使用多个接口,用逗号分开。

可扩展

一个接口可extend令一个接口。

作用

接口便于使不同类的实体使用相同的外层函数。例子:只要实现Comparable接口就能使用Arrays.sort函数。

    public  class Son extends Father implements Comparable<Son>{
        //...
        @Override
        public int compareTo(Son o) {
           return Double.compare(this.getAge(),o.getAge());
        }
    }

    @Test
    void sonSort(){
        var sons=new Son[2];
        sons[0]=new Son(3,"a");
        sons[1]=new Son(2,"b");
        Arrays.sort(sons);
        for(Son x: sons){
            System.out.println("name="+x.getName());
        }

    }

    //name=b
    //name=a

static

接口中允许存在静态方法,但没必要。

default

方法前加default关键词可不必override。

冲突

只要使用的两个接口中有相同的方法,无论它们是否有默认的实现,都需override。

类优先

如果同时使用extend和implement,不会产生冲突,因为接口的default都会被忽略。

修改字符串排序方式

原来按字典顺序排序

import java.util.Comparator;

public class LengthComparator implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        return o1.length()-o2.length();
    }
}

    @Test
    void comparatorOperate(){
        String[] str=new String[]{"application","dark"};
        System.out.println(str[0].compareTo(str[1]));
        System.out.println(new LengthComparator().compare(str[0],str[1]));
        Arrays.sort(str,new LengthComparator());
        System.out.println(Arrays.toString(str));
    }

    //-3
    //7
    //[dark, application]

clone

所有的数组类都有clone()方法。当想复制一个对象时,需使用Cloneable接口。

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Person implements Cloneable{
    private String name="unknown";
    private int age=0;
    private Date hireDay=new Date();

    public Person clone(){
        try{
            Person p2=(Person)super.clone();
            p2.hireDay=(Date) this.hireDay.clone();  //深拷贝
            return p2;
        }catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", hireDay=" + hireDay +
                '}';
    }
}

    @Test
    void cloneOperation(){
        Person p1=new Person();
        Person p2=p1.clone();
        System.out.println(p1.toString());
        System.out.println(p2.toString());
    }

2.lambda表达式

当使用接口后只有一个override方法,这个类的实例对象可以更简单的创造。

    @Test
    void comparatorOperate(){
        String[] str=new String[]{"application","dark"};
        System.out.println(str[0].compareTo(str[1]));
        System.out.println(new LengthComparator().compare(str[0],str[1]));
//        Arrays.sort(str,new LengthComparator());
        Comparator<String> comp=(String str1,String str2)->str1.length()-str2.length(); //comp是一个使用接口的具体类对象
        System.out.println(comp.compare("alive","zero")); //等效
        Arrays.sort(str,comp); //等效
//        Arrays.sort(str,(String str1,String str2)->str1.length()-str2.length()); //String可省略,只有一个参数时括号可省略
        System.out.println(Arrays.toString(str));

    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值