当前位置: 首页 > 知识库问答 >
问题:

这是嵌套类吗?

笪波鸿
2023-03-14

我在处理一个项目时遇到了这段代码,这被报告为某些内容的错误。

public class Test {

    public static Test ONE = new Test() {
        @Override
        public int value() {
            return 1;
        }
    };

    private Test() {
    }

    public int value() {
        return 0;
    }
}

我认为这段代码的意思是:
我认为这只是用一个名为 ONE 的引用变量实例化类 Test
用户提到的内容:
用户提到这是外部类中的嵌套类,但我对如何嵌套类本身感到困惑。
我所研究的:
我使用名为ANTLR的代码解析器来解析此代码,它表明这不是一个类,而是使用了令牌类型。
提前致谢

共有2个答案

董砚
2023-03-14

虽然极限答案是正确的,但可能会提供一些额外的解释。您的代码被解释为声明一个新的内部类,该类是 Test 的子类,然后实例化该类的对象:

public class Test {

    public static Test ONE = new $1();

    class $1 extends Test {
        @Override
        public int value() {
            return 1;
        }
    }

    private Test() {
    }

    public int value() {
        return 0;
    }
}

如果你编译你的测试。在java中,您将看到生成了两个类文件:Test。类和测试$1.class,后者包含自动生成的匿名内部类。匿名类的名称为$1,但因为它是Test的内部类,所以类文件的名称为Test$1.class。

胡志
2023-03-14

它是一个(嵌套的)匿名内部类,但不是人们通常所说的嵌套类,据我所知,嵌套类通常指的是非本地非匿名成员类。尽管任何不是顶级类的类都是嵌套类。

由于<code>new Test(){…}的匿名子类,因此该类不是“嵌套在自身中”。

我在这里找到了一个图表和一个非常详尽的代码示例列表。

import static java.lang.System.out;
@SuppressWarnings("unused")
public class Test {
    static String staticField = "field in class static context";
    String instanceField = "field in instance context";
    
    static Object staticRef1 = /* Static Field Reference to ... */
    /* ... Anonymous Inner Class created in static context */
    new Object() { 
        public void print() {
            out.println(staticField);
        }
    };
    
    static Object staticRef2; /* Static Field Reference to ... */
    static { /* static block ... */
        String localVar_InStaticBlock = "local variable in static block context";
        
        /* ... Anonymous Inner Class created in static block context */
        staticRef2 = new Object() {
            public void print() {
                out.println(localVar_InStaticBlock);
                out.println(staticField);
            }
        };
        
        /* Local Reference to Anonymous Inner Class created in static block context */
        Object localVar = new Object() {
            public void print() {
                out.println(localVar_InStaticBlock);
                out.println(staticField);
            }
        };
    }
    public Object instanceRef1 = /* Instance Field reference to ... */
    /* ... Anonymous Inner Class created in instance context */
    new Object() {
        public void print() {
            out.println(instanceField);
            out.println(staticField);
        }
    }; 

    /* Instance Field reference to ... */
    public Object instanceRef2;
    { /* instance block... */
        String localVar_InInstanceBlock = "local variable in instance block context";
        
        /* ... Anonymous Inner Class created in instance block context*/
        instanceRef2 = new Object() {
            public void print() {
                out.println(localVar_InInstanceBlock);
                out.println(instanceField);
                out.println(staticField);
            }
        };
        
        /* Local Reference to Anonymous Inner Class created in instance block context */
        Object localVar = new Object() {
            public void print() {
                out.println(localVar_InInstanceBlock);
                out.println(instanceField);
                out.println(staticField);
            }
        };
    }
    /* Nested Inner Class */
    class NestedInnerClass {
        public void foo() {
            out.println(instanceField);
            out.println(staticField);
        }
    }

    /* Nested Static Class */
    static class NestedStaticClass {
        public void foo() {
            out.println(staticField);
        }
    }
    void method() {
        String localVar_InMethodContext = "local variable in method context";
        
        /* Method-Local Inner Class */
        class MethodLocalInnerClass {
            void print() {
                out.print(localVar_InMethodContext);
                out.println(instanceField);
                out.println(staticField);
            }
        }
        
        Object methodLocalTest = new MethodLocalInnerClass();
        // ...
    }
}
 类似资料:
  • 目标 了解如何定义嵌套类和何时适合使用它们 了解使用嵌套类的副作用 了解 new 运算符在嵌套类中的特殊用法 了解如何和何时使用静态内部类和匿名内部类 在何处使用嵌套类 顾名思义,嵌套类(或内部类) 是在一个类中定义的另一个类。 public class EnclosingClass { . . . public class NestedClass { . . . } } 像成

  • 问题内容: 什么是静态嵌套类?静态和非静态嵌套类有什么区别? 问题答案: 静态内部类是嵌套在具有修饰符的另一个类中的类。除了可以访问在其内部定义的类的私有成员之外,它与顶级类几乎相同。 类是静态内部类。类是一个非静态的内部类。两者之间的区别是,非静态内部类的实例被永久连接到的实例-你不能创建一个没有。不过,您可以独立创建对象。 中的代码,并且都可以访问x; 不允许使用其他代码。

  • 我看过这段代码,我已经验证过了,它在w3c HTML5验证上返回VALID。 我很抱歉,我们不能在

  • 问题内容: 我可以做以下事情吗? 问题答案: 香草CSS不可能。但是,您可以使用类似: Sass使CSS再次变得有趣。Sass是CSS3的扩展,添加了嵌套规则,变量,mixins,选择器继承等。使用命令行工具或网络框架插件将其转换为格式良好的标准CSS。 要么 不用构造长的选择器名称来指定继承,在Less中,您可以简单地将选择器嵌套在其他选择器中。这样可以使继承更清晰,样式表更短。 例:

  • 本页包含内容: 嵌套类型实例 嵌套类型的引用 枚举类型常被用于实现特定类或结构体的功能。也能够在有多种变量类型的环境中,方便地定义通用类或结构体来使用,为了实现这种功能,Swift允许你定义嵌套类型,可以在枚举类型、类和结构体中定义支持嵌套的类型。 要在一个类型中嵌套另一个类型,将需要嵌套的类型的定义写在被嵌套类型的区域{}内,而且可以根据需要定义多级嵌套。 嵌套类型实例 下面这个例子定义了一个结

  • 问题内容: 我一直在尝试搜索包含嵌套字段的文档。我创建了这样的嵌套映射: 我的搜索如下所示: 但是我收到此错误消息: 编辑 我仍然收到此错误。我正在通过Java执行此操作,因此这是我要创建的文档: 像这样创建索引: 我认为我可能对文档编制了错误的索引。 问题答案: TLDR:输入您的嵌套类型。 假设我们有一个普通类型,并且嵌套了另一个类型: 该行是分配给的嵌套查询所必需的,如下所示: 该行似乎仅在