【问题标题】:Static method returning inner class返回内部类的静态方法
【发布时间】:2010-10-30 13:52:31
【问题描述】:

我真的不明白为什么下面的getMyClass2方法不能是静态的,为什么它不是有效的Java代码?

public class MyClass
{
    private class MyClass2
    {
        public String s1 = "";
        public String s2 = "";
    }

    private MyClass2 myClass2;

    private static MyClass2 getMyClass2()
    {
        MyClass2 myClass2 = new MyClass2();
        return myClass2;
    }

    public MyClass()
    {
        myClass2 = getMyClass2();
    }
}

【问题讨论】:

    标签: java static-methods inner-classes


    【解决方案1】:

    你不得不说内部类是静态的,因为非静态绑定到实例,所以它不能从静态方法返回

    public class MyClass
    {
        private static class MyClass2
        {
            public String s1 = "";
            public String s2 = "";
        }
    
        private MyClass2 myClass2;
    
        private static MyClass2 getMyClass2()
        {
            MyClass2 myClass2 = new MyClass2();
            return myClass2;
        }
    
        public MyClass()
        {
            myClass2 = getMyClass2();
        }
    }
    

    【讨论】:

    • 内部类默认不是静态的有什么原因吗?
    • @AOO 我认为它们实际上并没有多大用处
    【解决方案2】:

    (非静态)内部类实例总是与它们所在的类的实例相关联。静态方法将在不引用 MyClass 的特定实例的情况下被调用,因此如果它创建了 MyClass2 的实例,则不会有与之关联的 MyClass 实例。

    【讨论】:

    • 它们并不总是与实例相关联,只有当它们不是静态的时候才可以
    • 谢谢,在我的文字中澄清了这一点。
    • @Gaim:内部类永远不是静态的。它们被称为嵌套类。
    • @BalusC Okey,我很抱歉术语不好。
    • 谢谢大家,尽管知道 OP 所问的答案,我还是从这个问题中学到了 :)
    【解决方案3】:

    是的,

    因为 99% 的时间你不希望它们是静态的;D

    静态“嵌套”类只不过是在另一个类中定义的“顶级”类。如果上例中的静态类 MyClass2 是公共的,你可以简单地说 new MyClass.MyClass2();如果是普通的“内部类”,您必须对一个对象说,而不是对 MyClass 类: MyClass some = new MyClass() 然后是 new some.MyClass2() 之类的东西(我忘记了确切的语法)。

    问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多