2010-03-06 80 views
3

我听说静态方法应该只使用java中的静态变量。 但是,主要方法也是静态的,对吗?java中的静态方法

+15

是的,'main'方法是'static' - 你的问题是什么? – 2010-03-06 09:38:25

+0

我们可能不会在main中使用静态变量。我只想确认语句“静态方法应该只使用静态变量”。如果它是正确的,那么v如何在主要中使用非固定变量? – sandhya 2010-03-06 09:41:47

回答

12

你的问题:是的声明“静态方法应该只使用静态变量”是否正确?

不是。该声明不正确。

正确的说法将是“静态方法只能使用定义静态的实例变量”

看看下面的代码并阅读注释:

Class A{ 
    int i; 
    static int j; 

    public static void methodA(){ 
     i = 5; //cannot use since i is not static 
     j = 2; //can use. 

     int k = 3; //k is local variable and can be used no problem 

     **EDIT:**//if you want to access i 
     A a = new A(); 
     //A.i = 5; //can use. 
     a.i = 5; // it should be non-capital "a" right? 
    } 
} 
+0

哈..我得到了我需要的点.. thanq :) – sandhya 2010-03-06 10:20:36

+1

我修改回答包括“如何访问静态方法中的非静态实例变量” – 2010-03-06 17:57:22

+0

“实例变量定义静态”不正确。如果它们被定义为静态,则变量被命名为类变量(静态变量)而不是实例变量。静态方法直接访问类变量,并可以通过实例处理程序访问实例变量。 – Yergalem 2017-10-23 13:25:50

1

静态方法在类实例上调用,而不是在类的对象上调用。这意味着,静态方法不能访问实例变量,因为它们只是在对象中实例化。

如果要使用静态方法访问实例变量,则必须将该变量声明为静态。

public class Test { 
    private static int value = 0; 

    public static void main(String[] args) { 
     value++; 
    } 
} 

但说实话,用静态方法编写所有东西并不是最好的想法。最好使用主方法来实例化新对象。

0

是的静态方法不能直接调用类的非静态方法或变量。

编辑:可以创建任何局部变量。

+1

那么我们如何在主要方法中使用非静态变量? – sandhya 2010-03-06 10:19:06

+1

我认为你需要展示一个你认为'在主中使用非静态变量'的例子实际上意味着什么。我想你可能会对什么是(非)静态变量感到困惑。 – DaveJohnston 2010-03-06 10:27:21

16

首先,技术性:它的不是确实“main方法也是静态的”。您可以定义一个非静态的main方法,无论您选择什么签名;它只是不会成为有效的Java应用程序入口点。

关于“静态方法应该只使用静态变量”,这也是不是是真的。这里的关键概念是静态方法和字段是特定于类的,而不是特定于实例的。如果您实际上没有该类的实例,则无法访问实例变量/方法;这是一个编译错误。

所以确切地说,没有实例,你不能访问实例字段/方法。你可以在没有实例的情况下访问静态字段/方法。如果您需要从静态方法访问实例字段/方法,则必须通过简单实例化该类或通过从静态字段或方法参数获取对该类的实例的引用来获得该类的实例。

让我们来看看这个简单的例子:

public static void main(String args[]) { 
    System.out.println(args.length); 
} 

length不是静态字段;它是一个数组实例的实例字段,其中args是。静态方法main能够获取此实例(并因此访问其实例方法和字段),因为它作为参数传入。

另外,println不是一种静态方法;这是一个实例方法PrintStream实例。静态方法main能够通过访问类System的静态字段out来获取此实例。


总结:

  • 一个Java应用程序入口点是一家方法:
    • 被命名为main
    • publicstatic
    • 回报void,并采取了String[]参数作为参数
  • 命名为main的方法并不一定是一个Java应用程序入口点
    • (但它是最好的,为此目的保留这个名字)

此外,

  • 实例字段/方法只能通过实例访问
  • 静态字段/可以在没有实例访问方法
  • 静态方法可以通过下列方式之一获得一个类的实例:
    • 创建new实例
    • 有它作为参数传递
    • 访问它通过类
    • static领域接受它作为一类
    • CATC的static方法的返回值兴它作为一个抛出Throwable
1

要访问非静态字段(实例变量)你需要有一个实例。
里面一个非静态方法,this用作默认实例:

class AnyClass { 

    private String nonStaticField = "Non static"; 

    void nonStaticMethod() { 
     this.nonStaticField = "a text"; // accessing field of this 
     nonStaticField = "a text";  // same as before 
    } 
} 

里面一个静态方法没有this默认情况下使用,但你可以如果您提供实例,仍然可以访问实例变量:

class AnyClass { 

    private String nonStaticField = "Non static"; 

    static void staticMethod() { 
     AnyClass example = new AnyClass(); 
     example.nonStaticField = "new value for non-static field"; 
    } 
} 

- 领域也必须访问通过Java的访问控制(声明public或同一类......)

2

也许这段代码会启发你:

public class Main { 

    private String instanceField = "Joe"; 

    private void instanceMethod() { 
     System.out.println("Instance name=" + instanceField); 
    } 

    public static void main(String[] args) { 

     // cannot change instance field without an instance 
     instanceField = "Indy"; // compilation error 

     // cannot call an instance method without an instance 
     instanceMethod(); // compilation error 

     // create an instance 
     Main instance = new Main(); 

     // change instance field 
     instance.instanceField = "Sydney"; 

     // call instance method 
     instance.instanceMethod(); 
    } 
} 

所以你不能访问没有实例的实例成员。在静态方法的上下文中,除非您接收或创建实例,否则您没有对实例的引用。

希望这会有所帮助。

0

静态方法无法访问外部的非静态变量,因为您可以在不使用类初始化的情况下使用静态方法,但它不适用于非静态外部变量。但是你可以在静态方法中定义和使用非静态变量。

1

一个重要的事情是,除非你创建一个类的实例,实际上不存在实例变量,这意味着JVM不会有像int那样的变量,除非你为该类创建了一个实例。因此,在静态方法中使用实例变量是一个编译错误。

class A{ 
    int i; 
    static int j; 
    static int b(){ 
     i=10; // cannot be found 
     A a= new A(); 
     a.i=10;//can be found in a's instance 
    } 
} 

但是,我们可以在实例方法使用实例变量,因为当创建的对象所以在使用它里面的实例变量没有问题的实例方法只被调用。

希望你明白这些事情!