当我阅读有关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]);
}
}
最好的问候。
答案 0 :(得分:14)
1)内部与外部:
如果在方法中声明对象 ,它将仅在此方法中可见。基本上,如果你在它周围放置括号,它只能在这些括号内可见/可访问。
如果您声明对象在之外方法(在课堂内),则取决于 access modifier 。
默认情况下,它在该类和整个包中可见/可访问。
2)静态
静态意味着此Object / Variable属于类本身,而不属于其对象。
实施例:
public class Members {
static int memberCount;
public Members() {
memberCount++;
}
}
memberCount
只存在一次,无论该类存在多少个对象。 (甚至在创建任何对象之前!)
每次创建Members
的新对象时,memberCount
都会增加。现在您可以像这样访问它:Members.memberCount
答案 1 :(得分:3)
在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"
}
}
答案 2 :(得分:2)
我很感兴趣没人提到记忆问题。许多年前,在main()中实例化会将变量分配给堆栈,然后将主变量实例化为将变量分配给堆。在那些日子里,系统的堆栈非常小,所以不检查这个细节会导致堆栈溢出非常容易。我不是内存架构方面的专家,我希望有人可以为这个微妙的细节做出贡献,适用于当前的SW架构/内存。
答案 3 :(得分:1)
存在范围差异。 并且您必须将其声明为静态,因为您的main函数是静态的,因此它允许您仅使用静态变量。 在main方法中声明的变量只能在main方法中使用。
现在您可能想知道为什么我需要将main方法作为静态! 因为java中的任何应用程序都将从main方法运行,因此只能通过类名调用它而不创建任何对象,因此我们将其定义为静态。所有静态方法都可以使用类引用调用,不需要任何对象。
答案 4 :(得分:1)
差异在于您的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++;
}
}
正如你宣布的那样
<default package> int an_integer=0;
同一个包中的所有clases都可以访问此变量。
答案 5 :(得分:1)
您所指的是变量的范围。
方法内部的变量只能在此方法中访问,即an_integer
- 方法中的main
不能在main
方法之外引用。变量甚至可以具有更窄的范围,例如内部循环。 for
循环的经典迭代变量只能在其循环中可用,然后消失。
方法外的变量称为字段。它取决于它的访问修饰符,可以看到它。例如,Private
字段只能在此类中使用,public
字段可以从任何位置访问(其他访问修饰符为protected
且无,可以回退到默认值)。基本上,您可以使用类中的字段从此类中的每个方法访问其值,但是,如果多个线程访问同一个类的实例,这可能会很危险,但这是另一个故事。
字段和局部变量可能具有相同的名称,这可能会导致混淆。我通常不喜欢这样做,或者更好的是,总是引用具有this
访问者的字段。我并不确定是否存在局部变量与同名字段的偏好,但我认为局部变量在确定哪个变量时具有更高的优先级。
Static
字段现在意味着此变量不属于类的实例,而是属于类本身。可以读取(或调用)Static
个字段(和方法),而无需首先初始化类。一个例子可以是类的标准值,也可以是工厂方法(如果它是一个方法)。对于常量,Static
字段也可以与final
修饰符一起使用。 public final static
字段几乎是一个全局常量。