匿名内部类和 Lambda 表达式的区别

匿名内部类:
它是一个没有名称的内部类,并且只为其创建了一个对象。匿名内部类在创建具有某些“附加”的对象实例时可能很有用,例如重载类或接口的方法,而不必实际子类化一个类。
匿名内部类在为图形编程中的侦听器接口编写实现类时很有用。
匿名内部类的创建主要有两种方式:

  • 类(可以是抽象的或具体的)
  • 接口

语法:匿名类表达式的语法类似于构造函数的调用,只是在代码块中包含一个类定义。

// Test can be interface, abstract/concrete class Test t = new Test()  {    // data members and methods    public void test_method()     {       ........       ........     }    }; 

为了理解匿名内部类,我们来看一个简单的程序:

// Java program to demonstrate // the need for Anonymous Inner class  interface Age {     int x = 21;     void getAge(); }  class AnonymousDemo {     public static void main(String[] args)     {         // Myclass is implementation class of Age interface         MyClass obj = new MyClass();          // calling getage() method implemented at Myclass         obj.getAge();     } }  // Myclass implement the methods of Age Interface class MyClass implements Age {     @Override     public void getAge()     {         // printing the age         System.out.print("Age is " + x);     } } 

运行结果如下:

Age is 21 

Lambda表达式:
Lambda 表达式基本上表达了函数式接口的实例(具有单一抽象方法的接口称为函数式接口。一个例子是 java.lang.Runnable)。lambda 表达式实现了唯一的抽象函数,因此实现了函数式接口
lambda 表达式是在 Java 8 中添加的,并提供以下功能。

  • 启用将功能视为方法参数,或将代码视为数据。
  • 可以在不属于任何类的情况下创建的函数。
  • lambda 表达式可以像对象一样传递并按需执行。

示例代码:

// Java program to demonstrate lambda expressions // to implement a user defined functional interface.  // A sample functional interface (An interface with // single abstract method interface FuncInterface {     // An abstract function     void abstractFun(int x);  // A non-abstract (or default) function default void     normalFun()     {         System.out.println("Hello");     } }  class Test {     public static void main(String args[])     {         // lambda expression to implement above         // functional interface. This interface         // by default implements abstractFun()         FuncInterface fobj = (int x) -> System.out.println(2 * x);          // This calls above lambda expression and prints 10.         fobj.abstractFun(5);     } } 

运行结果:

10 

匿名内部类 Lambda 表达式的比较和区别如下:

匿名内部类 Lambda表达式
匿名内部类是一个没有名字的类。 Lambda表达式是一个没有名字的方法。(匿名函数)
匿名内部类可以扩展抽象类和具体类。 Lambda表达式不能扩展抽象类和具体类。
匿名内部类可以实现一个包含任意数量抽象方法的接口。 Lambda表达式可以实现一个包含单个抽象方法的接口。
在匿名内部类里面可以声明实例变量。 Lambda表达式不允许声明实例变量,无论声明的变量是否只是充当局部变量。
匿名内部类可以实例化匿名内部类。 无法实例化 Lambda 表达式。
在匿名内部类中,this总是指当前匿名内部类对象,而不是外部对象。 在 Lambda 表达式中,this总是指当前的外部类对象,即封闭类对象。
如果要处理多种方法,这是最好的选择。 如果要处理接口,Lambda表达式是最好的选择。
在编译时,会生成一个单独的 .class 文件。 在编译时,不会生成单独的 .class 文件。Lambda表达式只是将其转换为私有方法外部类。
每当创建对象时,内存分配都是按需分配的。 Lambda表达式驻留在 JVM 的永久内存中。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/264427.html

(0)
上一篇 2022年6月7日
下一篇 2022年6月7日

相关推荐

发表回复

登录后才能评论