【问题标题】:Static Classes, Methods and main()静态类、方法和 main()
【发布时间】:2016-07-29 19:24:07
【问题描述】:

所以,我是一个 java 菜鸟,我刚刚遇到了一些让我感到困惑的事情。言归正传,我创建了一个 Foo 类并创建了一个实例:

public class Main 
{
    public static void main(String[] args)
    {
        Foo foo = new Foo("Foo");
    }
}

class Foo
{
    public Foo(String A)
    {
        System.out.println(A);
    }
}

我注意到 Foo 类不必是静态的。为什么?而

如果我这样做

public class Main 
{
    public static void main(String[] args)
    {
        Foo foo = new Foo("Foo");
    }
    static class Foo
    {
        public Foo(String A)
        {
            System.out.println(A);
        }
    }
}

那么它必须是静态的。为什么有区别?静态意味着它是实例独立的,因此在静态方法中使用的每件事也必须是实例独立的(?)使用 Foo 我在静态方法中创建实例,因此 Foo 不需要是静态的。但是,里面有类有什么不同呢?我以为我已经了解了静态的概念。但显然我缺乏很多概念。

【问题讨论】:

    标签: java static main


    【解决方案1】:

    Java 是一种面向对象的编程语言。

    如果你需要一个类的非静态声明、字段、方法等,你需要从这个类创建一个实例。

    但是要访问静态字段,方法不需要创建实例。

    现在看看你的例子;

    1.Main 和 Foo 是不同的类,因此您可以在任何地方从 Foo 创建实例。

    public class Main {
        public static void main(String[] args) {
            Foo foo = new Foo("Foo");
        }
    }
    
    class Foo {
        public Foo(String A) {
            System.out.println(A);
        }
    }
    

    2.Foo 是一个内部类,如果未创建 Main 的实例,则永远无法访问 Foo 类。因此,如果您创建一个 Main 实例,您也可以创建 Foo 。但是在不创建 Main 实例的情况下,只有访问 Foo 才将 Foo 类定义为静态

    public class Main {
        public static void main(String[] args) {
            Foo foo = new Foo("Foo");
        }
    
        static class Foo {
            public Foo(String A) {
                System.out.println(A);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      在 java 中,我们不能将顶级类设为静态。只有嵌套类可以是静态的。 因此,对于第一种情况,您将无法将 Foo 类设为静态。 对于第二种情况,非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。静态嵌套类无权访问封闭类的其他成员。

      【讨论】:

        【解决方案3】:

        在第二个代码 sn-p 中,Foo 嵌套在 Main 中。嵌套类可以是内部类或静态类。如果它们是内部类(非静态),则内部类的每个实例都必须与封闭类的一个实例相关联。

        因此,如果您在第二个 sn-p 中从 Foo 类中删除 static 关键字,则必须将其实例化为:

        Foo foo = new Main().new Foo("Foo");
        

        当嵌套类是静态的时,它不需要封闭类的实例,你可以用它来实例化它

        Foo foo = new Foo("Foo");
        

        另一方面,在您的第一个 sn-p 中,Foo 没有嵌套在 Main 中,因此您不需要 Main 的实例来实例化它。而且它不能是静态的,因为顶级类不能是静态的。

        我以为我已经了解了静态的概念。但显然我缺乏很多概念。

        当应用于嵌套类时,static 关键字的含义与应用于方法和变量时的含义不同。您应该阅读有关嵌套类的信息。

        【讨论】:

          【解决方案4】:

          在上面的示例中,您在同一个文件中有两个独立的类。 main 可以引用 Foo,因为它只是另一个类。

          在下面的示例中,您有一个静态嵌套类。它也可以独立实例化。如果你去掉Foo 上的static 关键字,你就会有一个内部类,绑定到Main 的特定实例,但是当你运行静态main 方法时,没有@ 的特定实例987654328@参考。

          此参考可能会有所帮助:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

          【讨论】:

            【解决方案5】:

            JLS-8.1.3. Inner Classes and Enclosing Instances 覆盖了这部分内容,上面写着(部分)

            内部类是没有显式或隐式声明static的嵌套类。

            内部类可以是非static 成员类 (§8.5)、本地类 (§14.3) 或匿名类 (§15.9.5)。接口的成员类隐式为static (§9.5),因此永远不会被视为内部类。

            因此静态类不是内部类,内部类需要一个封闭类的实例;喜欢

            public class Main {
                public static void main(String[] args)
                {
                    Foo foo = new Main().new Foo("Foo");
                }
                class Foo
                {
                    public Foo(String A)
                    {
                        System.out.println(A);
                    }
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2021-08-11
              • 2019-10-29
              • 1970-01-01
              • 2014-05-12
              • 1970-01-01
              • 1970-01-01
              • 2019-05-22
              • 1970-01-01
              相关资源
              最近更新 更多