Java匿名类,Java匿名内部类

匿名类是指没有类名的内部类,必须在创建时使用new语句来声明类。其语法形式如下:

new <类或接口>() { // 类的主体};123复制代码类型:[java]

这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。使用匿名类可使代码更加简洁、紧凑,模块化程度更高。

匿名类有两种实现方式:

继承一个类,重写其方法。

实现一个接口(可以是多个),实现其方法。

下面通过代码来说明。

public class Out { void show() {
  System.out.println("调用 Out 类的 show() 方法");
 }
}public class TestAnonymousInterClass { // 在这个方法中构造一个匿名内部类
 private void show() {
  Out anonyInter = new Out() {   // 获取匿名内部类的实例
   void show() {
 System.out.println("调用匿名类中的 show() 方法");
   }
  };
  anonyInter.show();
 } public static void main(String[] args) {
  TestAnonymousInterClass test = new TestAnonymousInterClass();
  test.show();
 }
}123456789101112131415161718192021复制代码类型:[java]

程序的输出结果如下:

调用匿名类中的 show() 方法1复制代码类型:[java]

从输出结果可以看出,匿名内部类有自己的实现。

提示:匿名内部类实现一个接口的方式与实现一个类的方式相同,这里不再赘述。

匿名类有如下特点:

1)匿名类和局部内部类一样,可以访问外部类的所有成员。如果匿名类位于一个方法中,则匿名类只能访问方法中final类型的局部变量和参数。

public static void main(String[] args) { int a = 10; final int b = 10;
 Out anonyInter = new Out() {  void show() {   // System.out.println("调用了匿名类的 show() 方法"+a); // 编译出错
   System.out.println("调用了匿名类的 show() 方法"+b); // 编译通过
  }
 };
 anonyInter.show();
}1234567891011复制代码类型:[java]

从Java8开始添加了Effectivelyfinal功能,在Java8及以后的版本中代码第6行不会出现编译错误。

2)匿名类中允许使用非静态代码块进行成员初始化操作。

Out anonyInter = new Out() { int i; { // 非静态代码块
  i = 10; //成员初始化
 } public void show() {
  System.out.println("调用了匿名类的 show() 方法"+i);
 }
};12345678复制代码类型:[java]

3)匿名类的非静态代码块会在父类的构造方法之后被执行。

(0)

相关推荐

  • Java中的匿名内部类:由setOnClickListener说起

    在初学Android的时候,总是看到这样一段代码: Button button = (Button) findViewById(R.id.button); button.setOnClickListe ...

  • Java教程:Java Boolean类

    Boolean类将基本类型为boolean的值包装在一个对象中.一个Boolean类的对象只包含一个类型为boolean的字段.此外,此类还为boolean和String的相互转换提供了很多方法,并提 ...

  • Java教程:Java Byte类

    Byte类将基本类型为byte的值包装在一个对象中.一个Byte类的对象只包含一个类型为byte的字段.此外,该类还为byte和String的相互转换提供了方法,并提供了一些处理byte时非常有用的常 ...

  • Java Scanner类的常用方法及用法(很详细)

    Java Scanner类的方法及用法(很详细) Scanner类简介 Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序.它是以前的StringToken ...

  • 陆介政:套保姆级的Java入门教程,Java零基础入门

    ​最近很多人问我想学Java但是一点基础没有,网上看了一堆学习线路图还是无从下手.今天耗时3小时整理了一套保姆级的Java入门教程,建议收藏按照线路图一点点学习. 一.Java的概况 Java是199 ...

  • 《深入理解Java虚拟机》 Java对象的生命周期

    Java虚拟机运行时数据区 方法区:存储 类信息.常量.静态变量.即使编译器编译后的代码等数据,也有别名叫做非堆.  方法区其中有包含有 运行时常量池,用于存放编译期生成的各种字面量和符号引用.其中, ...

  • 2021最新整理Java教程:Java 智能卡迷你计算器

    介绍 本文是关于编写基于Java智能卡的应用程序.本教程将帮助初学者理解Java智能卡和主机应用程序之间的概念和通信.我已经看到Java智能卡技术的初学者提出了一些简单的问题,所以我决定为他们提供一个 ...

  • java学习——121.Java连数据库代码说明

    本篇介绍用JDBC连接数据库时各代码的含义. 1.指定JDBC驱动程序 调用Java.lang.Class类的forName()方法指定JDBC驱动程序类. 要注意的是,不同的数据库其forName( ...

  • java学习——58.java.swing学习

    AWT组件不是跨平台的,从外观到控制都依赖本地操作系统,所以称为重型组件.它会造成在不同的操作系统中会有不同的外观显现,所以现在均推荐使用Swing组件. Swing组件扩展了AWT,AWT中有的组件 ...

  • PHP匿名类的用法

    PHP匿名类的用法 在PHP7之后,PHP中加入了匿名类的特性.匿名类和匿名方法让PHP成为了更现代化的语言,也让我们的代码开发工作越来越方便.我们先来看看匿名类的简单使用. // 直接定义 $obj ...