静态 类、方法和 main()

Static Classes, Methods and main()

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

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 Class 不必是静态的。为什么?而

如果我这样做

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 不需要是静态的。但是里面有 class 有什么区别呢?我以为我已经了解了静电的概念。但显然我缺乏很多概念。

在第二个代码片段中,Foo 嵌套在 Main 中。嵌套的 classes 可以是内部的 classes 也可以是静态的。如果它们是内部 classes(非静态),则内部 class 的每个实例都必须与封闭 class.

的一个实例相关联

因此,如果您从第二个代码段的 Foo class 中删除 static 关键字,则必须使用 :

对其进行实例化
Foo foo = new Main().new Foo("Foo");

当嵌套的 class 是静态的时,它不需要封闭 class 的实例,您可以用

实例化它
Foo foo = new Foo("Foo");

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

I thought i'd got the concept of static down. but apparently i lack a lot of concepts.

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

的内容

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

如果您需要来自 class 的非静态声明、字段、方法等,您需要从此 class.

创建一个实例

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

现在看看你的例子;

1.Main 和 Foo 是不同的 classes 所以你可以在任何地方从 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 是内部 class 并且如果未创建 Main 的实例,则 Foo class 永远无法访问。所以如果你创建一个 Main 实例,你也可以创建 Foo 。但是没有创建 Main 实例,只有访问 Foo 是将 Foo class 定义为 static

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);
        }
    }
}

JLS-8.1.3. Inner Classes and Enclosing Instances 涵盖了(部分)

An inner class is a nested class that is not explicitly or implicitly declared static.

An inner class may be a non-static member class (§8.5), a local class (§14.3), or an anonymous class (§15.9.5). A member class of an interface is implicitly static (§9.5) so is never considered to be an inner class.

静态 class 因此不是内部 class,内部 class 需要封闭 [=22] 的 实例 =];喜欢

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);
        }
    }
}

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

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

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

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