所以,我是一个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不需要是静态的。但那里面的课程有什么不同呢?我以为我有静态的概念。但显然我缺乏很多概念。
答案 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类视为静态。 对于第二个场景非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。静态嵌套类无权访问封闭类的其他成员。