声明变量的主方法和内部主方法有什么区别?

当我阅读有关Java的书时,我看到了一个这样写的例子。 我想知道我可以在main方法之外声明变量吗? 声明变量外部和内部主方法有什么区别? 什么是“静态”在这里的作用? 请有人向我解释一下? 我是java的新手。

public class Printstuff { static int an_integer = 0; public static void main(String[] args) { int an_integer = 2; String[] some_strings = {"Shoes", "Suit", "Tie" }; an_integer = an_integer - 1; some_strings[an_integer] = some_strings[an_integer] +"+++"; for (int i = 0; i < some_strings.length; i++) System.out.println(some_strings[Printstuff.an_integer]); } } 

最好的祝福。

1)内部与外部:

如果方法中声明对象,则仅在此方法中可见。 基本上,如果你在它周围放置括号,它只能在这些括号内可见/可访问。

如果在方法之外 (在类内)声明对象,则它取决于访问修饰符
默认情况下,它在该类和整个包中可见/可访问。

2)静态

静态意味着此Object / Variable属于类本身,而不属于其对象。

例:

 public class Members { static int memberCount; public Members() { memberCount++; } } 

无论该类存在多少个对象, memberCount只存在一次。 (甚至在创建任何对象之前!)

每次创建新的Members对象时, memberCount增加memberCount 。 现在您可以像这样访问它: Members.memberCount

在main方法中声明变量将使其仅在main中可用。 在外部声明变量将使其可用于类的所有方法,包括main方法。

示例:

 public class Foo { private String varOne = "Test"; public void testOne() { System.out.println(varOne); System.out.println(varTwo); // Error, this variable is available in the testTwo method only } public void testTwo() { String varTwo = "Bar"; System.out.println(varOne); // Will display "Test" System.out.println(varTwo); // Will display "Bar" } } 

我很好奇没人提到记忆问题。 许多年前,在main()中实例化会将变量分配给堆栈,然后将主变量实例化为堆将变量分配给堆。 在那些日子里,系统的堆栈非常小,因此不检查这些细节会导致堆栈溢出非常容易。 我不是内存架构方面的专家,我希望有人可以为这个微妙的细节做出贡献,适用于当前的SW架构/内存。

存在范围差异。 并且您必须将其声明为静态,因为您的main函数是静态的,因此它允许您仅使用静态变量。 在main方法中声明的变量只能在main方法中使用。

现在您可能想知道为什么我需要将main方法作为静态! 由于java中的任何应用程序都将从main方法运行,因此只能通过类名调用它而不创建任何对象,因此我们将其定义为静态。 所有静态方法都可以使用类引用调用,不需要任何对象。

不同之处在于你的an_integer有更大的范围。

示例,如果您有另一种方法。

 public class Printstuff { static int an_integer = 0; public static void main(String[] args) { int an_integer = 2; String[] some_strings = {"Shoes", "Suit", "Tie" }; an_integer = an_integer - 1; some_strings[an_integer] = some_strings[an_integer] +"+++"; for (int i = 0; i < some_strings.length; i++) System.out.println(some_strings[Printstuff.an_integer]); } public void anotherMethod(){ an_integer++; } } 

正如你宣布的那样

int an_integer=0;

同一个包中的所有clases都可以访问此变量。

你所指的是变量的范围。

方法内部的变量只能在此方法中访问,即main -method中的an_integer不能在main方法之外引用。 变量甚至可以具有更窄的范围,例如内部循环。 for循环的经典迭代变量只能在其循环中可用,之后它就消失了。

方法之外的变量称为字段。 它取决于它的访问修饰符,可以看到它。 例如, Private字段只能在此类中使用, public字段可以从任何地方访问(其他访问修饰符protected ,没有,这取决于默认值)。 基本上,您可以使用类中的字段从此类中的每个方法访问其值,但是,如果多个线程访问同一个类的实例,这可能会很危险,但这是另一个故事。

字段和局部变量可能具有相同的名称,这可能会导致混淆。 我通常不喜欢这样做,或者,更好的是,总是引用具有this访问器的字段。 我并不确定是否存在局部变量与同名字段的偏好,但我认为局部变量在确定哪个变量时具有更高的优先级。

Static字段现在意味着此变量不属于类的实例,而是属于类本身。 可以读取(或调用) Static字段(和方法),而无需首先初始化类。 一个例子可以是类的标准值,也可以是工厂方法(如果是方法)。 对于常数, Static字段也可以与final修饰符一起使用。 public final static字段几乎是一个全局常量。