Java核心技术卷Ⅰ —— 接口、匿名类、Lambda表达式、泛型

admin 2022年4月17日09:03:33评论68 views字数 2360阅读7分52秒阅读模式

一、接口



interface、多继承、所有方法均为抽象方法、没有字段

二、匿名类



匿名类格式如下


new 父类构造器(参数列表)|实现接口()      {       //匿名内部类的类体部分      }


它不能是抽象类,必须继承某个类或某个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。且不能定义构造函数,不能存在任何静态成员变量和静态方法。匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。

三、Lambda表达式



Java Lambda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法。但Lambda表达式不能取代所有匿名内部类,只能用来取代函数接口(函数接口,是指内部只有一个抽象方法的接口)。

eg1 无参

JDK7 匿名内部类写法


new Thread(new Runnable(){// 接口名       @Override       public void run(){// 方法名              System.out.println("Thread run()");       }}).start(); JDK8 Lambda表达式写法new Thread(              () -> System.out.println("Thread run()")// 省略接口名和方法名).start();


上述代码跟匿名内部类的作用是一样的,但比匿名内部类更进一步。这里连接口名和函数名都一同省掉了。


eg2 有参

JDK7 匿名内部类写法


Listlist = Arrays.asList("I", "love", "you", "too");Collections.sort(list, new Comparator(){// 接口名    @Override    public int compare(String s1, String s2){// 方法名        if(s1 == null)            return -1;        if(s2 == null)            return 1;        return s1.length()-s2.length();    }});


 JDK8 Lambda表达式写法


Listlist = Arrays.asList("I", "love", "you", "too");Collections.sort(list, (s1, s2) ->{// 省略参数表的类型    if(s1 == null)        return -1;    if(s2 == null)        return 1;    return s1.length()-s2.length();});


 

四、泛型




泛型”简单的意思就是泛指的类型(参数化类型)典型的就是

ArrayList Listlist=new ArrayList<>();


1.泛型类

类需要有很好的扩展性,那么我们可以将其设置成泛型的


class DataHolder{    T item;
public void setData(T t) { this.item=t; }
public T getData() { return this.item; }}


泛型类定义时只需要在类名后面加上类型参数即可,当然你也可以添加多个参数,类似于,等。这样我们就可以在类里面使用定义的类型参数。

 泛型类最常用的使用场景就是“元组”的使用。我们知道方法return返回值只能返回单个对象。如果我们定义一个泛型类,定义2个甚至3个类型参数,这样我们return对象的时候,构建这样一个“元组”数据,通过泛型传入多个对象,这样我们就可以一次性方法多个数据了。

2.泛型方法

泛型方法既可以存在于泛型类中,也可以存在于普通的类中。


class DataHolder{    T item;
public void setData(T t) { this.item=t; }
public T getData() { return this.item; }
/** * 泛型方法 * @param e */ public void PrinterInfo(E e) { System.out.println(e); }}


public与返回值中间声明,标明此方法为泛型方法,泛型类中使用了泛型成员的方法不是泛型方法。

3.泛型接口


public interface Generator{    public T next();}在声明类的时候,需将泛型的声明也一起加到类中class FruitGeneratorimplements Generator{    @Override    public T next() {        return null;    }}

4.Java泛型的通配符,上下边界

使用泛型的时候,我们还可以为传入的泛型类型实参进行上下边界的限制,如:类型实参只准传入某种类型的父类或某种类型的子类


public void showKeyValue1(Generic obj){    Log.d("泛型测试","key value is " + obj.getKey());}

Genericgeneric1 = new Generic("11111");Genericgeneric2 = new Generic(2222);Genericgeneric3 = new Generic(2.4f);Genericgeneric4 = new Generic(2.56);

//这一行代码编译器会提示错误,因为String类型并不是Number类型的子类//showKeyValue1(generic1);

showKeyValue1(generic2);showKeyValue1(generic3);showKeyValue1(generic4);



其它还有下界通配符<? super T> <?>无限通配符


五、参考链接



https://objcoding.com/2019/03/04/lambda/

https://www.liaoxuefeng.com/wiki/1252599548343744/1265102638843296



不晓得这首歌里蕴含着多少故事


原文始发于微信公众号(赛博少女):Java核心技术卷Ⅰ —— 接口、匿名类、Lambda表达式、泛型

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月17日09:03:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Java核心技术卷Ⅰ —— 接口、匿名类、Lambda表达式、泛型http://cn-sec.com/archives/880053.html

发表评论

匿名网友 填写信息