Java多线程(二) 实现接口方式以及lamda表达式

Java多线程(二) 实现接口方式以及lamda表达式

当我们写出一个interface接口后,需要有类去实现implements他,并且实现接口中的函数,而实现接口的方式有五种,下面分别介绍一下这五种方式。

1、普通方式

最常见的就是在一个类的外部implements接口

interface Student
{
    void study();
}

class Pupil implements Student
{

    @Override
    public void study() {
        System.out.println("我是一名小学生");
    }
}

public class implementClass {
    public static void main(String[] args) {
        Pupil pupil = new Pupil();
        pupil.study();
    }
}

2、静态内部类

静态内部类是给实现接口的类加上static修饰词,使得这个类能够存在另一个类的里面

interface Student
{
    void study();
}


public class implementClass {

    //静态内部类
    static class Junior implements Student
    {

        @Override
        public void study() {
            System.out.println("我是一名初中生");
        }
    }

    public static void main(String[] args) {
        Junior junior = new Junior();
        junior.study();

    }
}

3、局部内部类

局部内部类是可以在某个函数中实现接口的类,如果只是想在一个代码块中使用这个类,之后不再使用的话,可以使用这种方法。在下面的例子中就是实现了一个Senior类在main函数中。

interface Student
{
    void study();
}

public class implementClass {

    public static void main(String[] args) {
        //局部内部类
        class Senior implements Student
        {

            @Override
            public void study() {
                System.out.println("我是一名高中生");
            }
        }
        
        Junior junior = new Junior();
        junior.study();
    }
}

4、匿名内部类

匿名内部类与局部内部类一样,可以在某个函数体中使用,不同的是,匿名内部类是不用给新类起名字的(这就是叫作“匿名”的原因),匿名内部类是直接实现接口的函数即可。

interface Student
{
    void study();
}

public class implementClass {
    public static void main(String[] args) {
        //匿名内部类
        Student underGraduate = new Student(){
            @Override
            public void study() {
                System.out.println("我是一名大学生");
            }
        };
        underGraduate.study();
    }
}

5、lamda表达式

5.1、函数式接口

函数式接口是指只含有一个函数的接口,例如下面这个接口就是一个函数式接口。

interface MathOperation {
      int operation(int a, int b);
}
5.2、lamda表达式

lamda表达式是实现函数式接口的一种简单方式,他的形式类似于下面的样子

(parameters) -> expression  或  (parameters) ->{ statements; }

"->"这个符号的后面就是实现接口中函数的代码,具体可以看下面这个例子

interface Student
{
    void study();
}

public class implementClass {

    public static void main(String[] args) {
        //lamda表达式
        Student student = ()->{
            System.out.println("我是一名研究生");
        };
        student.study();
}
5.3、传参和返回值问题

lamda表达式是形式上简化了实现接口的方式,但实际上和一般实现接口一样,也可以传参和返回值,例如下面的例子:

interface Clock
{
    String printTime(int hour, int minute, int second);
}

public class implementClass {
    public static void main(String[] args) {
        //传递参数、返回参数的lamda表达式
        Clock clock = (int hour,int minute,int second)->{
            String res = hour+":"+minute+":"+second+" ";
            System.out.println("现在时间是 "+res);
            return res;
        };
        String getreturn = clock.printTime(12,12,12);
        System.out.println("获得的返回值是 "+getreturn);
    }
}

这段代码的输出如下
在这里插入图片描述

5.4、访问外部变量

lamda表达式可以访问外部变量,但是不能修改外部变量,否则会报错!

interface Car
{
    void run();
}

public class implementClass {
    public static void main(String[] args) {

        int speed = 100;
        //测试能够访问的外部变量
        Car acar = ()->
        {
            //能够访问局部变量
            System.out.println("车速是"+speed);

        };
        acar.run();
    }
}

这段代码是访问外部变量,所以正常输出了,但是如果修改了外部变量,那么就会报错 Variable used in lambda expression should be final or effectively final
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值