其表示, 非静态变量不能在静态method.But公共静态无效的主要does.How使用是什么?
Answer 1:
不,没有。
public class A {
int a = 2;
public static void main(String[] args) {
System.out.println(a); // won't compile!!
}
}
但
public class A {
static int a = 2;
public static void main(String[] args) {
System.out.println(a); // this works!
}
}
或者,如果你实例化A
public class A {
int a = 2;
public static void main(String[] args) {
A myA = new A();
System.out.println(myA.a); // this works too!
}
}
也
public class A {
public static void main(String[] args) {
int a = 2;
System.out.println(a); // this works too!
}
}
将工作,因为a
是这里的局部变量,而不是一个实例变量。 一种方法,局部变量是该方法的执行过程中总是可到达的,不管如果方法static
或没有。
Answer 2:
是的,主要方法可以通过实际的情况下访问非静态变量,但只是间接的。
例:
public class Main {
public static void main(String[] args) {
Example ex = new Example();
ex.variable = 5;
}
}
class Example {
public int variable;
}
当他们说人意味着什么“不能在静态方法中使用非静态变量”是同一类的非静态成员不能直接访问(如图Keppils答案的实例)。
相关问题:
- 通过在Java中的主要方法访问非静态成员
更新:
在谈到非静态变量的一个暗示是指成员变量 。 (由于局部变量不能有可能一个static修饰符反正。)
在代码
public class A {
public static void main(String[] args) {
int a = 2;
System.out.println(a); // this works!
}
}
你声明的局部变量(通常是不被称为即使它没有一个static修饰符非静态)。
Answer 3:
主要的方法没有访问非静态成员要么。
final public class Demo
{
private String instanceVariable;
private static String staticVariable;
public String instanceMethod()
{
return "instance";
}
public static String staticMethod()
{
return "static";
}
public static void main(String[] args)
{
System.out.println(staticVariable); // ok
System.out.println(Demo.staticMethod()); // ok
System.out.println(new Demo().instanceMethod()); // ok
System.out.println(new Demo().instanceVariable); // ok
System.out.println(Demo.instanceMethod()); // wrong
System.out.println(instanceVariable); // wrong
}
}
这是因为默认情况下,当你调用一个方法或变量,它是真正访问this.method()
或this.variable。 但在main()方法或任何其他静态方法(),尚未创建任何“本”的对象。
在这个意义上说,静态方法不包含它的类的对象实例的一部分。 这是工具类背后的想法。
要调用在静态情况下的任何非静态方法或变量,需要先建立一个构造函数的对象或工厂就像你会以外的任何地方之类的。
更深入:
基本上它是一个Java IMO的设计允许就好像它们是实例成员被引用静态成员(方法和字段)的一个漏洞。 这可能是在这样的代码很混乱:
Thread newThread = new Thread(runnable);
newThread.start();
newThread.sleep(1000);
这看起来就像是发送新的线程睡眠,但实际上编译分解成这样的代码:
Thread newThread = new Thread(runnable);
newThread.start();
Thread.sleep(1000);
因为sleep
是永远只能使当前线程睡眠的静态方法。
事实上,该变量甚至不检查非无效(更多;它曾经是,我相信):
Thread t = null;
t.sleep(1000);
有些IDE可以配置成发出这样的代码警告或错误 - 你不应该这样做,因为它伤害了可读性。 (这是将其通过C#校正的缺陷之一...)
Answer 4:
**在这里你可以看到表中清除静态和非静态方法静态和非静态数据成员的访问。 **
Answer 5:
您可以创建在像静态方法非静态引用:
static void method() {
A a = new A();
}
同样的事情,我们做的情况下, public static void main(String[] args)
方法
Answer 6:
public class XYZ
{
int i=0;
public static void increament()
{
i++;
}
}
public class M
{
public static void main(String[] args)
{
XYZ o1=new XYZ();
XYZ o2=new XYZ();
o1.increament();
XYZ.increament(); //system wont be able to know i belongs to which object
//as its increament method(static method)can be called using class name system
//will be confused changes belongs to which object.
}
}