相关疑难解决方法(0)

为什么匿名内部类不包含从此代码生成的任何内容?

package com.test;

public class OuterClass {
    public class InnerClass {
        public class InnerInnerClass {

        }
    }

    public class InnerClass2 {

    }

    //this class should not exist in OuterClass after dummifying
    private class PrivateInnerClass {
        private String getString() {
            return "hello PrivateInnerClass";
        }
    }

    public String getStringFromPrivateInner() {
        return new PrivateInnerClass().getString();
    }
}
Run Code Online (Sandbox Code Playgroud)

javac在命令行上运行时Sun JVM 1.6.0_20,此代码生成6个.class文件:

OuterClass.class
在OuterClass $ 1.class
在OuterClass $ InnerClass.class
在OuterClass $ InnerClass2.class
在OuterClass $ $将InnerClass InnerInnerClass.class
在OuterClass $ PrivateInnerClass.class

在eclipse中运行JDT时,它只生成5个类.

OuterClass.class
$在OuterClass 1.class …

java anonymous-class inner-classes

33
推荐指数
3
解决办法
4877
查看次数

每个内部类都需要一个封闭的实例吗?

术语内部类通常用于表示"需要封闭实例的嵌套类".但是,JLS声明如下:

8.1.3.内部类和封闭实例

[...]

内部类包括本地(§14.3),匿名(§15.9.5)和非静态成员类(§8.5).

[...]

声明在静态上下文中发生的内部类的实例没有词法封闭的实例.

也,

15.9.5.匿名类声明

[...]

匿名类始终是内部类(第8.1.3节); 它永远不会static(§8.1.1,§8.5.1).

众所周知,匿名类可以在静态上下文中声明:

class A {
  int t() { return 1; }
  static A a =  new A() { int t() { return 2; } };
}
Run Code Online (Sandbox Code Playgroud)

要尖锐地描述它,

new A() {} 是一个没有封闭实例的嵌套类,在静态上下文中定义,但它不是静态嵌套类 - 它是一个内部类.

我们是否都在日常使用中为这些条款赋予了不恰当的含义?

作为一个相关的兴趣点,这个历史规范文档将术语顶层定义为内部的反面:

作为static类成员的类和作为包成员的类都称为顶级类.它们与内部类的不同之处在于顶级类只能直接使用它自己的实例变量.

而在常见用法中,顶层被认为是嵌套的反面.

java class jls

33
推荐指数
1
解决办法
5465
查看次数

私有内部类的构造函数也是私有的吗?

我正在重构一个正在变大的android项目.运行lint为我提供了JSME问题 外部和内部类之间的私有成员访问.考虑以下示例

public class Outer {
    private Inner mInner = new Inner();

    private class Inner {}
}
Run Code Online (Sandbox Code Playgroud)

我得到了这些信息

Name
   private field Inner mInner

Location
   class Outer (default package)

Problem synopsis
   Access to private member of class 'Inner' at line 2

Problem resolution
   Make 'Inner' constructor package-local
Run Code Online (Sandbox Code Playgroud)

应用问题解决方案会将源更改为

public class Outer {
    private Inner mInner = new Inner();

    private class Inner {
        Inner() {}
    }
}
Run Code Online (Sandbox Code Playgroud)

我此刻有点困惑.到现在为止,我认为这个例子相当于

public class Outer {
    private Inner mInner = new Inner();

    private class …
Run Code Online (Sandbox Code Playgroud)

java android inner-classes android-lint android-studio

7
推荐指数
1
解决办法
1167
查看次数