从main方法和main main方法中声明变量有什么区别?

时间:2013-07-17 12:46:19

标签: java

当我阅读有关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]);
        }
    }

最好的问候。

6 个答案:

答案 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字段几乎是一个全局常量。