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

12
当我在阅读有关Java的书籍时,看到了一个像这样编写的示例。 我想知道我是否可以在main方法之外声明变量?在main方法内部和外部声明变量有什么区别?“static”在这里的作用是什么?请有人解释一下?我是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个回答

17

1) 内部 vs 外部:

如果您将对象声明为方法内部的, 它只会在该方法中可见。 基本上,如果您在括号内放置它,则仅从这些括号内可见/访问。

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

2) 静态

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

例如:

public class Members {

  static int memberCount;

  public Members() {
     memberCount++;
  }
}

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

每当您创建一个Members对象时,memberCount都会增加。现在您可以像这样访问它:Members.memberCount


那么,如果你只在主方法中使用变量,我可以说你应该在主方法中声明该变量,这样对吗? - Slaknation

4

在主方法中声明一个变量只能使其在主方法中可用。在外部声明一个变量将使其对该类的所有方法都可用,包括主方法。

例子:

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"
   }
}

在同一包中将类外部的内容传递给其他类 - nachokk
1
@nachokk:就这种情况而言,它取决于访问说明符。 - pratZ
1
这段代码无法编译,因为varOne是非静态的,所以无法从静态的main()方法中访问。 - bcsb1001
@bcsb1001 对不起,你是对的,我发帖时可能脑子进了水。感谢您的评论,我已经编辑了我的回答 :) - Mohamed Amine

2

我很惊讶没有人提到内存问题。很多年前,将变量实例化在main()函数中,会使该变量分配到堆栈中;将其实例化在main()之外,则会使其分配到堆中。在那些年代,系统的堆栈非常小,因此不仔细检查这个细节就很容易导致堆栈溢出。虽然我不是内存架构方面的专家,但我希望有人能就当前软件架构/内存方面的这个微妙细节做出贡献。


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;

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


欢迎您,考虑接受任何答案并给那些让您理解的人点赞 :) - nachokk

1

作用域有所不同。由于您的主函数是静态的,因此必须将其声明为静态,这样只允许您使用静态变量。在主方法内部声明的变量仅在主方法内部使用。

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


1
你所提到的是变量的作用域。
方法内部的变量只能在该方法内访问,例如main方法中的an_integer不能在main方法外引用。变量的作用域甚至可以更小,例如在循环内部。经典的迭代变量for仅在其循环内部可用,在其后便消失了。
方法外部的变量称为字段。它的可见性取决于其访问修饰符。private字段仅在该类内部可用,而public字段则可以从任何地方访问(其他访问修饰符包括protected和无修饰符,默认情况下没有修饰符)。基本上,您可以使用类内的字段来从每个方法内访问其值,但是如果多个线程访问同一类的实例,则可能会出现危险,但这是另一个故事了。
一个字段和一个局部变量可能有相同的名称,这可能会导致混淆。我通常不希望这样做,或者更好的做法是始终使用 this 访问器引用字段。我不确定本地变量与同名字段之间是否有偏好,但我猜测在确定要使用哪个时,本地变量优先级更高。 Static 字段现在意味着该变量不属于类的实例,而是属于类本身。可以在不必先初始化类的情况下读取(或调用)Static 字段(和方法)。例如类的标准值或工厂方法(如果是方法)等。与 final 修饰符一起使用,Static 字段也可能对常量非常有用。 public final static 字段基本上是全局常量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接