java中的静态方法
我听说静态方法应该只使用java中的静态变量。 但是,主要方法也是静态的,对吗?
你的问题:声明“静态方法应该只使用静态变量”是否正确?
不。声明不正确。
正确的语句将是“静态方法只能使用那些定义为静态的实例变量”
看看下面的代码并阅读评论:
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(); //Ai = 5; //can use. ai = 5; // it should be non-capital "a" right? } }
首先,技术性:“ main
方法也是静态的” 并非如此。 您可以使用您选择的任何签名定义非静态main
方法; 它只是一个有效的Java应用程序入口点。
关于“静态方法应该只使用静态变量”,这也不是真的。 这里的关键概念是静态方法和字段是特定于类的,而不是特定于实例的。 如果您实际上没有该类的实例,则根本无法访问实例变量/方法; 这是一个编译错误。
所以准确地说,如果没有实例,则无法访问实例字段/方法。 您可以在没有实例的情况下访问静态字段/方法。 如果需要从静态方法访问实例字段/方法,则必须以这种或那种方式获取该类的实例,方法是简单地实例化它,或者从静态字段或方法参数获取对它的引用。
我们来看看这个简单的例子:
public static void main(String args[]) { System.out.println(args.length); }
length
不是静态场; 它是数组实例的实例字段, args
是。 静态方法main
能够获取此实例(从而访问其实例方法和字段),因为它作为参数传入。
另外, println
不是静态方法; 它是PrintStream
实例的实例方法。 静态方法main
能够通过访问类System
的静态字段来获取此实例。
总结一下:
- Java应用程序入口点是一种方法:
- 被命名为
main
- 是
public
和static
- 返回
void
并将String[]
参数作为参数
- 被命名为
- 名为
main
的方法不必是Java应用程序入口点- (但最好为此目的保留此名称)
此外,
- 实例字段/方法只能通过实例访问
- 可以在没有实例的情况下访问静态字段/方法
- 静态方法可以通过以下方式之一获取类的实例:
- 创建一个
new
实例 - 让它作为一个参数传递
- 通过类的
static
字段访问它 - 接受它作为类的
static
方法的返回值 - 把它当作抛出的
Throwable
- 创建一个
要访问非静态字段(实例变量),您需要拥有一个实例。
在非静态方法中, 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"; } }
1 – Java的访问控制也必须可以访问该字段(声明为public
或在同一个类中……)
也许这段代码会启发你:
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(); } }
因此,如果没有实例,则无法访问实例成员。 在静态方法的上下文中,除非您接收或创建实例,否则您没有对实例的引用。
希望这可以帮助。
静态方法在类实例上调用,而不是在类的对象上调用。 这意味着,静态方法无法访问实例变量,因为它们仅在对象中实例化。
如果要使用静态方法访问实例变量,则必须将该变量声明为static。
public class Test { private static int value = 0; public static void main(String[] args) { value++; } }
但说实话,用静态方法编写所有东西并不是最好的主意。 最好使用main方法实例化新对象。
一个重要的事情是,除非你创建一个类的实例,实例变量实际上并不存在,这意味着JVM不会像int我那样使用变量,除非你为该类创建一个实例。 因此,在静态方法中使用实例变量是编译错误。
class A{ int i; static int j; static int b(){ i=10; // cannot be found A a= new A(); ai=10;//can be found in a's instance } }
但是,我们可以在实例方法中使用实例变量,因为实例方法仅在创建对象时调用,因此在其中使用实例变量没有问题。
希望你清楚这些事情!
是静态方法不能直接调用类的非静态方法或变量。
编辑 :可以创建任何局部变量。
静态方法无法访问外部的非静态变量,因为您可以在没有类初始化的情况下使用静态方法,但它不适用于非静态外部变量。 但是您可以在静态方法中定义和使用非静态变量。