12

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

此致。

4

6 回答 6

17

1)内部与外部:

如果你一个方法中声明你的对象,它只会在这个方法中可见。基本上,如果你在它周围加上括号,它只能从这些括号内可见/可访问。

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

2) 静态

静态意味着,静态方法/变量属于类本身,而不是它的对象(该类的实例)。

例子:

public class Members {

  static int memberCount;

  public Members() {
     memberCount++;
  }
}

memberCount不管类的对象有多少,只存在一次。(甚至在创建任何对象之前!)

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

于 2013-07-17T12:56:38.833 回答
4

在 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"
   }
}
于 2013-07-17T12:48:28.907 回答
2

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

于 2015-06-15T17:59:55.610 回答
1

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

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

于 2013-07-17T12:48:51.237 回答
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;

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

于 2013-07-17T12:53:02.190 回答
1

您指的是变量的范围。

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

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

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

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

于 2013-07-17T13:18:05.810 回答