`

匿名类

 
阅读更多

 

匿名类

匿名类可以让你的代码更简洁,可以同时声明并实例化一个类。匿名类就像一个没有名称的本地类。如果有一个本地类只使用一次,那么就可以用到匿名类

 

声明匿名类

本地类定义是类声明,匿名类是在表达式中定义。在下面的例子中,在本地变量spanishGreet的初始化语句中使用到匿名类,在本地变量的初始化中使用了本地类。(初始化和初始化语句的区别可以自己看代码理解)

class HelloWorldAnonymousClass {
    interface HelloWorld{
        public void greet();
    }

    public void sayHello(){
        class EnglishGreeting implements HelloWorld{
            @Override
            public void greet() {
                System.out.println("hello");
            }
        }

        HelloWorld englishGreet = new EnglishGreeting();

        HelloWorld spanishGreet = new HelloWorld() {
            @Override
            public void greet() {
                System.out.println("hola");
            }
        };

        englishGreet.greet();
        spanishGreet.greet();
    }

}

 

匿名类语法

正如前面提到的,匿名类是一个表达式。除了有一个类定义在一个代码块中之外,匿名类的语法就像调用一个构造函数一样。

匿名类表达式包含以下几个部分:

1.new 关键词

2.要实现的接口或要继承的类的名称,在这个例子中就是接口HelloWorld

3.一个包含构造函数参数的括号,就像一个一般类的实例化创建表达式那样。如果是实现一个接口的话,那就没有构造函数,所以直接使用空括号

4.一个类定义实体

由于匿名类定义是一个表达式,那它就必须是语句的一部分。上面例子中,匿名类表达式就是spanishGreet变量初始化语句的一部分。(这也说明为什么在最后要跟个封号)

 

匿名类使用规则

就像本地类一样,匿名类可以获得外部作用域的本地变量

1.匿名类可以获得外部类的成员

2.匿名类不能获得外部作用域中不是final或实际final的本地变量

3.就像内嵌类一样,在匿名类中声明的类型(比如变量)会遮蔽外部作用相同名称的声明

匿名类关于它的成员,也有跟本地类一样的限制条件

1.不能在匿名类中声明静态初始化或成员接口

2.一种例外就是静态成员时常量变量时

可以在匿名类中声明以下内容:

1.属性

2.不在继承父类或接口中存在的额外的方法

3.实例初始化

4.本地类

但是不能再匿名类中声明一个构造函数

 

匿名类的原理

跟本地类一样,不过就是通过编译器给一个class名称罢了

 

分享到:
评论

相关推荐

    匿名类/内部类/本地类 解读

    在Java编程语言中,匿名类、内部类和本地类是三种特殊的类定义方式,它们各自具有独特的特性和用途。下面将详细解读这三者之间的差异,并通过实例来帮助理解。 首先,**匿名类**是在没有类名的情况下创建的类,通常...

    匿名类的特点

    ### 匿名类的特点 #### 一、定义与特点 匿名类是一种特殊的类,它没有显式的类名,因此无法通过直接引用的方式被调用。匿名类的主要特点是它必须在创建的同时作为`new`语句的一部分来声明。其基本语法结构如下: ...

    java 内部类使用(内部匿名类)

    2. **内部匿名类**:内部匿名类没有名字,通常用于创建一次性使用的类。它们常用于实现接口或继承一个类,特别是在事件处理、回调机制和简短的辅助类中。创建匿名内部类的方式是在实例化类时直接定义类的实现,不...

    Java中的内部类和匿名类

    Java 中的内部类和匿名类 Java 中的内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在 C++ 里也有,那就是嵌套类(Nested Class)。内部类从表面上看,就是在类中又定义了一个类,而实际上并没有那么...

    内部类和匿名类大汇总

    在Java编程语言中,内部类和匿名类是两种特殊的类定义方式,它们为代码提供了更高的灵活性和封装性。本文将详细讲解这两种类的概念、特点以及实际应用。 首先,我们来看内部类。内部类分为四种类型:成员内部类、...

    使用内部和匿名类优化Java代码

    Java 1.1 引入了内部类和匿名类,这两种特性极大地增强了代码的灵活性和可读性。内部类是指定义在另一个类内部的类,它可以是静态的或非静态的,根据其是否需要访问外部类的实例成员来区分。静态内部类与普通类的...

    实现接口的匿名类

    在给定的代码示例中,我们看到了如何通过匿名类的方式来实现接口并调用接口中定义的方法。 首先,我们来看一下接口A的定义: ```java interface A { public void exPrint(); } ``` 这个接口A只有一个方法exPrint()...

    java 内部类 局部内部类 匿名类 实例代码

    本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析。 1. **实例内部类**:这是最常见的内部类形式,它在外部类的实例方法或成员位置定义。实例内部...

    JAVA匿名类创建对象.doc

    ### Java匿名类创建对象 #### 一、Java匿名类简介 在Java编程语言中,类是面向对象程序设计的基本组成部分之一。通常情况下,我们在定义一个类时会为它指定一个名称,以便后续可以通过该名称来实例化这个类的对象...

    Java匿名类的分析和理解.pdf

    Java匿名类的分析和理解 Java匿名类是Java编程语言中的一种特殊的类,它没有明确的类名。匿名类经常被用在Java GUI程序设计中,例如在Swing库中,以便快速地创建GUI组件。然而,很多Java学习者对匿名类的理解不够...

    java中的匿名内部类总结

    Java 中的匿名内部类是一种特殊的内部类,它没有名字,因此也称为匿名类。匿名内部类是一种简洁的编程方式,能够简化代码编写,但它也有一些限制和特点。 匿名内部类的定义 匿名内部类是指没有名字的内部类,它是...

    java基础--list(ArrayList、LinkedList、匿名类).docx

    【Java基础——List接口详解(ArrayList、LinkedList、匿名类)】 在Java编程中,List接口是集合框架的重要组成部分,提供了有序存储元素的功能。ArrayList和LinkedList是List接口的两种主要实现,它们各有优缺点,...

    Java匿名类机制改善代码.pdf

    Java匿名类机制是Java语言中一个独特而强大的特性,它允许我们在不定义单独类的情况下创建类的实例。这种机制在需要一次性使用的或者只需要一个简单实现的类时特别有用,能够减少代码的冗余,提高代码的简洁性。在...

    JavaLambda表达式和匿名类.pdf

    在描述中提到的代码示例中,对比了使用匿名类和Lambda表达式实现相同功能的方法。 首先,让我们看看匿名类的使用。在传统的Java编程中,如果需要一个简单的接口实现,我们通常会创建一个新的类来实现这个接口,如`...

    Java的内部类和匿名类剖析

    在那些修改中,引人注目的是内部类和匿名类。如运用得当,它们可使程序更易理解和维护。本文介绍内部类和匿名类在Java代码中是如何具体工作的,如何正确使用它们,以及如何避免一些常见的错误。 下面来看看这些特性...

    java基础-匿名类的使用

    在Java中,匿名类是一种没有显式声明名称的类。它常用于在创建对象时直接定义类的实现或重写类的方法。 使用匿名类可以简化代码,特别是在需要实现接口或继承抽象类的情况下。

    我自己用匿名类写的简易计算器

    这是我自己写的第一个小程序,希望共享给大家

    Kotlin 匿名类实现接口和抽象类的区别详解

    Kotlin 匿名类实现接口和抽象类的区别详解 Kotlin 中的匿名类是指没有明确声明的类,这种类通常用于实现接口或继承抽象类。在 Kotlin 中,匿名类可以用来实现接口或继承抽象类,但是它们之间有一些关键的区别。 ...

    PHP7 新特性:常量数组、匿名类、Closure-call().md

    - **定义**:匿名类可以在任何地方定义,但仅限于当前作用域内使用。 - **示例代码**: ```php $instance = new class { private $value; public function __construct($value) { $this->value = $value; } ...

Global site tag (gtag.js) - Google Analytics