Java 在主方法外声明变量和在主方法内声明变量有什么区别?

Java 在主方法外声明变量和在主方法内声明变量有什么区别?,java,Java,当我读关于Java的书时,我看到一个这样写的例子。我想知道我可以在main方法之外声明变量吗?在main方法外部和内部声明变量有什么区别?“静态”在这里扮演什么角色?请谁给我解释一下?我是java新手 public class Printstuff { static int an_integer = 0; public static void main(String[] args) { int an_integer = 2; S

当我读关于Java的书时,我看到一个这样写的例子。我想知道我可以在main方法之外声明变量吗?在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]);
        }
    }
公共类Printstuff{
静态整数=0;
公共静态void main(字符串[]args){
整数=2;
字符串[]一些字符串={“鞋子”、“西装”、“领带”};
一个整数=一个整数-1;
一些_字符串[一个_整数]=一些_字符串[一个_整数]+“+++”;
for(int i=0;i

致以最诚挚的问候。

在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方法内部的变量只能在main方法内部使用

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

不同之处在于现在您的
整数具有更大的范围

例如,如果您有其他方法

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


    }
公共类Printstuff{
静态整数=0;
公共静态void main(字符串[]args){
整数=2;
字符串[]一些字符串={“鞋子”、“西装”、“领带”};
一个整数=一个整数-1;
一些_字符串[一个_整数]=一些_字符串[一个_整数]+“+++”;
for(int i=0;i
正如你宣布的那样

intan_整数=0

同一包中的所有类别都可以访问此变量。1)内部与外部:

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

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

2)静态

静态意味着这个对象/变量属于类本身,而不是它的对象

例如:

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


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

您所指的是变量的范围

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

方法之外的变量称为字段。它取决于它的访问修饰符在哪里可以看到它<例如,code>Private
字段仅在此类中可用,
public
字段可以从任何位置访问(其他访问修饰符是受保护的
和无,这取决于默认设置)。基本上,您可以使用类内的字段从该类内的每个方法访问其值,但是,如果多个线程访问同一个类的实例,这可能是危险的,但这完全是另一回事

字段和局部变量可能具有相同的名称,这可能会导致混淆。我通常不希望这样做,或者,也许更好,总是引用带有
this
访问器的字段。我不能完全确定是否存在局部变量相对于同名字段的偏好,但我猜在确定哪个是局部变量时,局部变量的优先级更高


静态
字段现在表示此变量不属于类的实例,而是属于类本身<可以读取(或调用)代码>静态
字段(和方法),而无需先初始化类。例如,可以是类的标准值,也可以是factorymethod(如果是方法的话)<代码>静态
字段与
最终
修饰符一起也可用于常量。
公共最终静态
字段几乎是一个全局常量。

我很感兴趣,没有人提到内存问题。许多年前,在main()中实例化会将变量分配给堆栈,而在ot main中实例化则会将变量分配给堆。在那个时候,系统的堆栈非常小,所以不检查这个细节很容易导致堆栈溢出。虽然我不是内存架构方面的专家,但我希望有人能对这个微妙的细节做出贡献,因为它适用于当前的软件架构/内存

从类外到同一包中的其他类too@nachokk:就在这种情况下。它取决于访问说明符。此代码不会编译,因为
varOne
是非静态的,因此无法从静态
main()
方法访问。@bcsb1001 M
public class Members {

  static int memberCount;

  public Members() {
     memberCount++;
  }
}