我听说静态方法应该只使用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();
//A.i = 5; //can use.
a.i = 5; // it should be non-capital "a" right?
}
}
静态方法在类实例上调用,而不是在类的对象上调用。这意味着,静态方法不能访问实例变量,因为它们只是在对象中实例化。
如果要使用静态方法访问实例变量,则必须将该变量声明为静态。
public class Test {
private static int value = 0;
public static void main(String[] args) {
value++;
}
}
但说实话,用静态方法编写所有东西并不是最好的想法。最好使用主方法来实例化新对象。
是的静态方法不能直接调用类的非静态方法或变量。
编辑:可以创建任何局部变量。
那么我们如何在主要方法中使用非静态变量? – sandhya 2010-03-06 10:19:06
我认为你需要展示一个你认为'在主中使用非静态变量'的例子实际上意味着什么。我想你可能会对什么是(非)静态变量感到困惑。 – DaveJohnston 2010-03-06 10:27:21
首先,技术性:它的不是确实“main
方法也是静态的”。您可以定义一个非静态的main
方法,无论您选择什么签名;它只是不会成为有效的Java应用程序入口点。
关于“静态方法应该只使用静态变量”,这也是不是是真的。这里的关键概念是静态方法和字段是特定于类的,而不是特定于实例的。如果您实际上没有该类的实例,则无法访问实例变量/方法;这是一个编译错误。
所以确切地说,没有实例,你不能访问实例字段/方法。你可以在没有实例的情况下访问静态字段/方法。如果您需要从静态方法访问实例字段/方法,则必须通过简单实例化该类或通过从静态字段或方法参数获取对该类的实例的引用来获得该类的实例。
让我们来看看这个简单的例子:
public static void main(String args[]) {
System.out.println(args.length);
}
length
是不是静态字段;它是一个数组实例的实例字段,其中args
是。静态方法main
能够获取此实例(并因此访问其实例方法和字段),因为它作为参数传入。
另外,println
是不是一种静态方法;这是一个实例方法PrintStream
实例。静态方法main
能够通过访问类System
的静态字段out
来获取此实例。
总结:
- 一个Java应用程序入口点是一家方法:
- 被命名为
main
- 是
public
和static
- 回报
void
,并采取了String[]
参数作为参数
- 被命名为
- 命名为
main
的方法并不一定是一个Java应用程序入口点- (但它是最好的,为此目的保留这个名字)
此外,
- 实例字段/方法只能通过实例访问 个
- 静态字段/可以在没有实例访问方法
- 静态方法可以通过下列方式之一获得一个类的实例:
- 创建
new
实例 - 有它作为参数传递
- 访问它通过类
- 的
static
领域接受它作为一类 - CATC的
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";
}
}
- 领域也必须访问通过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();
}
}
所以你不能访问没有实例的实例成员。在静态方法的上下文中,除非您接收或创建实例,否则您没有对实例的引用。
希望这会有所帮助。
静态方法无法访问外部的非静态变量,因为您可以在不使用类初始化的情况下使用静态方法,但它不适用于非静态外部变量。但是你可以在静态方法中定义和使用非静态变量。
一个重要的事情是,除非你创建一个类的实例,实际上不存在实例变量,这意味着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
}
}
但是,我们可以在实例方法使用实例变量,因为当创建的对象所以在使用它里面的实例变量没有问题的实例方法只被调用。
希望你明白这些事情!
- 1. Java中的静态方法
- 2. Java中的静态方法
- 3. Java静态方法
- 4. Java静态方法
- 5. 静态方法 - Java的
- 6. 的Java:从静态方法
- 7. 的Java syncrhonized静态方法
- 8. Java错误:静态方法无法引用非静态方法
- 9. java中静态方法中的静态变量
- 10. Java静态方法参数
- 11. Java - 同步静态方法
- 12. Java重写静态方法
- 13. Java,使方法静态
- 14. Java静态方法+类
- 15. Java无名静态方法
- 16. Java:访问静态方法
- 17. java中的静态方法main
- 18. 了解Java中的静态方法
- 19. Java:静态方法与非静态方法
- 20. (Java)静态通用方法与泛型类静态方法
- 21. 静态方法和非静态方法Java
- 22. Java中的静态和非静态方法Intercall
- 23. Java中的静态初始化程序和静态方法
- 24. 调用静态类中的非静态方法 - java
- 25. 在java中的静态方法,我可以以非静态方式访问静态方法吗?
- 26. 在java中调用非静态方法
- 27. 在静态Java方法中访问类
- 28. 静态静态方法?
- 29. 在java中的静态方法vs实例方法的决定?
- 30. Java:无法对非静态方法进行静态引用
是的,'main'方法是'static' - 你的问题是什么? – 2010-03-06 09:38:25
我们可能不会在main中使用静态变量。我只想确认语句“静态方法应该只使用静态变量”。如果它是正确的,那么v如何在主要中使用非固定变量? – sandhya 2010-03-06 09:41:47