静态类,方法和main()

时间:2016-04-08 13:41:37

标签: java static main

所以,我是一个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不需要是静态的。但那里面的课程有什么不同呢?我以为我有静态的概念。但显然我缺乏很多概念。

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

因此,如果您从第二个代码段中的static类中删除Foo关键字,则必须使用以下内容对其进行实例化:

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

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

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

另一方面,在您的第一个代码段中,Foo未嵌套在Main内,因此您不需要Main的实例来实例化它。并且它不能是静态的,因为顶级类不能是静态的。

  

我以为我有静态的概念。但显然我缺乏很多概念。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

在下面的示例中,您有一个静态嵌套类。它也可以独立实例化。如果您删除了static上的Foo关键字,那么您将拥有一个与Main的特定实例绑定的内部类,但是当您运行静态main时方法没有Main的特定实例可供参考。

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

答案 4 :(得分:0)

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