[英]Static Classes, Methods and 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不必是静态的。 但是,里面的类有什么不同? 我以为我有静态下降的概念。 但显然我缺乏很多概念。
JLS-8.1.3对此进行了介绍。 内部类和包含实例 (部分)
内部类是未显式或隐式声明为
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);
}
}
}
在第二个代码段中, Foo
嵌套在Main
。 嵌套类可以是内部类,也可以是静态类。 如果它们是内部类(非静态),则内部类的每个实例都必须与封闭类的一个实例相关联。
因此,如果您从第二个片段的Foo
类中删除static
关键字,则必须使用实例化它:
Foo foo = new Main().new Foo("Foo");
当嵌套类是静态的时,它不需要封闭类的实例,您可以使用以下方法实例化它
Foo foo = new Foo("Foo");
另一方面,在您的第一个代码段中, Foo
没有嵌套在Main
,因此您不需要实例Main
来实例化它。 而且它不能是静态的,因为顶级类不能是静态的。
我以为我有静态下降的概念。 但显然我缺乏很多概念。
当应用于嵌套类时, static
关键字的含义与应用于方法和变量时的含义不同。 您应该阅读有关嵌套类的信息。
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);
}
}
}
在最上面的示例中,同一文件中有两个独立的类。 main
可以引用Foo
因为它只是另一个类。
在底部的示例中,您有一个静态的嵌套类。 它也可以独立实例化。 如果您在Foo
上摆脱了static
关键字,则会有一个内部类,它绑定到Main
的特定实例,但是当您运行static main
方法时,没有要引用的Main
特定实例。
该参考可能会有所帮助: https : //docs.oracle.com/javase/tutorial/java/javaOO/nested.html
在Java中,我们不能将顶级类设为静态。 只有嵌套的类可以是静态的。 因此,对于第一种情况,您将无法使Foo类成为静态类。 对于第二种情况,即使非静态嵌套类(内部类)被声明为私有,也可以访问其周围的其他成员。 静态嵌套类无权访问封闭类的其他成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.