首页 > 编程语言 >Java 双括号初始化(匿名内部类初始化)

Java 双括号初始化(匿名内部类初始化)

时间:2024-09-16 20:34:55浏览次数:12  
标签:初始化 Java name ArrayList public 括号 new age

原文:Java:双括号初始化 / 匿名内部类初始化法

ArrayList 可以这样初始化:

// 新建一个列表并赋初值 A、B、C
ArrayList<String> list = new ArrayList<String>() {{
    add("A");
    add("B");
    add("C");
}};

还有其他集合比如 HashMap 的初始化:

Map map = new HashMap() {{ 
    put("Name", "Jones"); 
    put("QQ", "1125535"); 
}};

这种方式比起先创建对象,再一条条 add,显得更加简洁和优雅。这种方法被称为双大括号初始化(double brace initialization)或者匿名内部类初始化法

理解

这里以 ArrayList 的例子解释,首先第一层花括号定义了一个继承于 ArrayList 的匿名内部类(Anonymous Inner Class):

// 定义了一个继承于 ArrayList 的类,它没有名字
new ArrayList<String>(){
  // 在这里对这个类进行具体定义
};

第二层花括号实际上是这个匿名内部类实例初始化块(Instance Initializer Block)(或称为非静态初始化块):

new ArrayList<String>(){
  {
    // 这里是实例初始化块,可以直接调用父类的非私有方法或访问非私有成员
  }
};

我们通过 new 得到这个 ArrayList 的子类的实例并向上转型为 ArrayList 的引用:

ArrayList<String> list = new ArrayList<String>() {{}};
  • 我们得到的实际上是一个 ArrayList 的子类的引用,虽然这个子类相比 ArrayList 并没有任何功能上的改变。
  • 可以认为这是个本身装有数据的子类(因为它的数据来自于自身的初始化),而不是取得引用后再添加值。

下面自定义一个类并使用这种方式初始化:

class Person{
  protected String name;
  protected int age;

  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
}
...
public static void main(String[] args) {
  Person p = new Person(){
    {
      name = "Jones";     // 或者调用 setName()
      age = 3;            // 或者 setAge()
    }
  };
  System.out.println(p.getName() + p.getAge());
}

注意:这种方法一定程度上使代码更简洁,但同时可能降低可读性。

标签:初始化,Java,name,ArrayList,public,括号,new,age
From: https://www.cnblogs.com/Higurashi-kagome/p/18416576

相关文章

  • 60.《Java集合框架-List-Set-Map》
    此篇所写不知道你们是否在网页开发的时候当看到要写Map集合什么HashMap之类的突然蒙了虽然之前学过突然让你调用方法懵了所以在此总结一下以备后需对比数组可存储任意类型对象且存储长度是可以变的集合类乃内存层面对数据进行存储数据库是持久层断电后仍长期存在......
  • java的方法和数组
    什么是方法呢?就类似c语言的函数                            返回类型 方法名   形式参数列表方法名最好使用小驼峰的形式,在java中方法不可以嵌套使用, 方法的调用:就是在main方法里面写上调用的方法名加......
  • 重生之我在Java世界------学单例设计模式
    什么是单例设计模式?单例模式是面向对象编程中最简单却又最常用的设计模式之一。它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的原理、常见实现方法、优缺点,以及在使用过程中可能遇到的陷阱。单例模式的核心原理单例模式的实现主要......
  • 基于springboot的图书商城管理系统。Javaee项目,springboot项目。
    演示视频:基于springboot的图书商城管理系统。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Maven+Layui+Thymeleaf来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。界面简洁......
  • Springboot宠物领养管理系统。Javaee项目。Springboot项目。
    演示视频:Springboot宠物领养管理系统。Javaee项目。Springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。界面简洁,操作简单。系统......
  • 基于springboot的家庭理财管理系统。Javaee项目,springboot项目。
    演示视频:基于springboot的家庭理财管理系统。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Maven+Layui来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。分为系统管理员,家主,用户三类身......
  • Springboot+vue汽车销售管理系统。Javaee项目,springboot vue前后端分离项目。
    演示视频:Springboot+vue汽车销售管理系统。Javaee项目,springbootvue前后端分离项目。系统介绍:本文设计了一个基于Springboot+vue的前后端分离的汽车销售管理系统,采用M(model)V(view)C(controller)三层体系结构,通过SpringBoot+Vue+maven+IDEA来实现。有经理和销售两种角......
  • Javaweb之SpringBootWeb案例之阿里云OSS服务集成的详细解析
     2.3.3集成阿里云oss对象存储服务的准备工作以及入门程序我们都已经完成了,接下来我们就需要在案例当中集成oss对象存储服务,来存储和管理案例中上传的图片。编辑在新增员工的时候,上传员工的图像,而之所以需要上传员工的图像,是因为将来我们需要在系统页面当中访问并展示员工的图像。......
  • java毕业设计——基于java+Mybatis的仓库管理系统设计与实现(全套源码+配套论文)——仓
    基于java+Mybatis的仓库管理系统设计与实现(毕业论文+程序源码)大家好,今天给大家介绍基于java+Mybatis的仓库管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。文章目录:基于java+Mybatis的仓库管理系统设计与实现(毕业论文+程序源码)1、项目简介2、资源......
  • java毕业设计——基于java+Spring的新闻发布及管理系统设计与实现(全套源码+配套论文)—
    基于java+Spring的新闻发布及管理系统设计与实现(毕业论文+程序源码)大家好,今天给大家介绍基于java+Spring的新闻发布及管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。文章目录:基于java+Spring的新闻发布及管理系统设计与实现(毕业论文+程序源码)1、......