Java中的匿名类介绍

158 阅读3分钟

我们知道,Java语言主要遵循OOPs概念(从Java 1.8开始,我们得到了函数式编程)。所以在Java中没有匿名函数,但我们可以通过扩展内类的概念来创建匿名对象

匿名类

我们将在这里讨论的话题:

什么是匿名类?

  • Java匿名内类是一个没有名字的内类,只为其创建一个对象。

  • 它的工作方式与本地类一样,对其成员的所有限制都是一样的。

  • 你可以在一个匿名类里面声明以下内容:

    • 属性(字段)
    • 方法(只有实例方法),即使它们没有实现超类型的任何方法。
    • 实例初始化器
    • 本地类

如何创建匿名类?

实际上,在各种工作中,我们都会使用匿名类。因此,有很多理由来实现它。
这里我们将看看其中的一个例子:

// Step 1: Create an example class containing at least one member.
class A{
  public void show(){
   System.out.println("We are inside A class");
 }
}

// Step 2: Create the Main class which contains the main method.

public class Main{

  public static void main(String [] args){
  
  // Step 3: Create simple object and call the show() method
  A obj1 = new A();
  obj1.show();
  System.out.println("====================================");
  
  // Step 4: Create anonymous object
     A obj = new A(){
     
     @Override
     public void show(){
      
       System.out.println("Anonymous class has been created");
       
     } 
     }; //A semicolon is essential here.
  
  // Step 5 : Use your anonymous object.
  
    obj.show();
       
  }
}

输出

We are inside A class
====================================
Anonymous class has been created

双重括号初始化

像一个资深的Java开发者,如果你想创建一个匿名类,那就学一学这个武器吧。 双括号初始化是java中两个独立过程的结合。有两个{大括号参与其中。如果你在java代码中看到两个连续的大括号{,这就是双括号初始化的用法。第一个括号是创建一个匿名内类,第二个括号是一个初始化块。 当你为一个匿名内类使用初始化块时,就变成了java双括号初始化。

让我们看看它的实现:

/*Here we will create a list in which the elements are 
stored with the help of double brace initialization.*/

import java.util.*;

public class Main{

public static void main(String[] args){

List <Integer> list = new ArrayList<>()
{{
 // Double Brace Initialization
 add(56);
 add(67);
 add(90);
 add(78);
 add(35);

}};

// print the list
System.out.println(list);
}
}

输出

[56, 67, 90, 78, 35]

什么时候使用它?

匿名类的创建只是为了一次性使用,我们不能重复使用它,让我们考虑一些情况:

  • 当你的唯一目的是重写一个方法
  • 当你想实现任何功能接口时。(我们将在现实世界实现的帮助下看到它)

真实世界的实现

由于匿名类是为一次性使用而创建的,它主要用于应用开发。现在,你可以想象任何一个Android应用程序,
也许我们需要实例化一个接口来为用户界面的某个特定按钮提供功能。但我们知道,一个接口不能直接实例化。在这种情况下,匿名类可以使你的代码更加简洁。它们使你能够同时声明和实例化一个类:

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity2 extends AppCompatActivity {

        private Button button;
        
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        
        button= findViewById(R.id.button_display);
        
        // set button funtionality in the  anonymous class
        button.setOnClickListener(new View.OnClickListener() {
        
            @Override
            public void onClick(View v) {
                
                /* this code will help you to display the particular message in the mobile screen.
                   whenever the button is clicked.
                 */
                Toast.makeText(MainActivity2.this,"Button is Clicked",Toast.LENGTH_LONG).show();
            }
        });
    }
}

输出
openiq_f.png

问题

Q:)1

匿名类中可以有静态成员吗?

不可以

可以

除了那些常量成员,匿名类不能有任何静态成员。

Q:)2

我们可以在匿名类中访问外层类的所有成员吗?

可以

不可以

当然,原因是匿名类持有对包围类的隐式引用,通过该引用它可以访问外层类的任何/所有成员字段和方法。

通过OpenGenus的这篇文章,你一定对Java中的匿名类有了完整的了解。