java - java中的成员嵌套类?

标签 java class nested

如果我们有代码...

public class Hello
{
    public static void main(String args[])
    {
        Outer obj=new Outer();
        obj.method1();
    }
}

class Outer
{
    void method1()
    {
        class Inner
        {
        }
    }
}

我想知道,内部类何时会被 ClassLoader 加载。 它是在调用 method1() 时加载的,还是在我们创建它的实例时加载的?类 Inner 没有在 method1() 中执行任何操作,它是一个空类。另外,我想知道,如何在上面的例子中创建一个内部类的实例?

最佳答案

Class Outer.Inner 将在另一个类作为变量类型、方法参数类型、方法返回类型、父类(super class)类型、类型参数绑定(bind)或目标类型引用它时首次加载加载初始化程序或静态方法,或静态变量引用的宿主类。在您的示例中,我希望它永远不会被加载。

Also,I wanted to know,how to create an instance of inner class in the above example?

正如所写,类 Outer.Inner 只能在方法 Outer.method1() 中访问,因此它只能在该方法中实例化。在那里,您可以只使用 new Inner()。如果您希望它可以从其他地方实例化,则将其声明移出方法主体:

class Outer
{
    class Inner
    {
    }

    void method1()
    {
    }
}

无论如何,这对于命名内部类来说是更好的形式。 Outer.Inner 何时加载或是否加载它不会改变。

随着这一变化,您可以通过 new Inner() 的形式在 Outer 的构造函数或实例方法中的任何位置实例化 Outer.Inner .但是,如果您想从不同的类中实例化一个,或者在 Outer 类的静态方法中实例化一个,那么就有点棘手了。要认识到的重要一点是,Outer.Inner 的每个实例都需要一个关联的 Outer 实例。这是在 Outer 的实例方法中执行实例化时根据上下文确定的,但如果在没有这样的上下文的情况下执行,则语法为:

    public static void main(String args[])
    {
        Outer obj=new Outer();
        Outer.Inner inner = obj.new Outer.Inner();
    }

关于java - java中的成员嵌套类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31090810/

相关文章:

html - 使用 CSS 和 HTML 内联显示

c# - 这是访问枚举的安全方法吗?

c++ - 如何在它们之间分配和使用 2 个不同类的函数指针?

ruby-on-rails - 使用设计 Rails 多个注册路径

css - Rails 样式在 link_to 嵌套表单中丢失

java - 使用 weka api 进行聚类

java - Hibernate 不提交数据

java - Jhipster - MySQL java.sql.SQLException : Access denied for user 'root' @'localhost' (using password: NO) 错误

javascript - 多个数组,需要找到嵌套数组位置

Java Random - 总是打印 1