JAVA:为什么类名不加static就无法调用

public static class Node{
int step, nr;
}

public static void main(String[] args) {
Queue<Node> Q = new LinkedList<Node>();
Node Now = new Node(); //如果Node类不加static就无法调用
}

好了加分
public class Main {
public static class Node{
int step, nr;
}

public static void main(String[] args) {
Queue<Node> Q = new LinkedList<Node>();
Node Now = new Node(); //如果Node类不加static就无法调用
}
}

我日,不懂装懂的人真多,不要误人子弟。
static修饰的成员是类成员:其调用可以用“类名。成员名”“对象名。成员名”这两种方式调用无差别。
非static修饰的成员是实例(对象)成员:其调用必须用“对象名。成员名”调用。
只要你使用上述方法去调用,无论你是在“static调用非static,还是在非static调用static,static调用static,非static调用非static”,都是可以的,而且是最标准的。(注:有得书上写static不能调用非static这句话的前提是同一个类内的直接调用,我本人不建议直接调用非static成员)
关于调用强调
非static调用非static若为同一个类的内部成员也可直接调用不必加对象名,但和加对象名的在内存中是有区别的;

哎又说多了。总之楼主牢记:无论在任何地方只要:static用“类名。成员名”调用,非static用“对象名。成员名”就不会错。语法就这样。

如果非要进一步:static成员属于类,非static成员属于对象(想理解这句话要更进一步)
更进一步,那就到java运行时内存分布了:
java 运行时内存分为堆,栈,方法区(还有寄存器,和本地方法栈,这两个用不到,除非你开发JVM)。一个class文件类加载后就放到了java运行时的内存区里,怎么放的如下:
类刚被加载时所有类的信息都放入方法区(也叫永久区,也就是永远存在的区),方法区里有常量池用来存放 常量 包括String常量,其他的(包括所有的修饰符啦,标示符啦方法代码了等等)也都放在方法区,总之类class被放在方法区。
这也就是说所有的类信息都在方法区,同时方法区会为常量,Static变量开辟额外空间存储其数值(非Static方法内的变量方法区内只存储其代码(方便理解叫代码,其实应该叫字符),其值是存在栈内)。
堆内存储的是对象(书上写的),严格意义上说,堆存储的是每个类非Static变量(类的实例成员属性)的值,和一个指向生成该对象的类的指针(目的指向类Static变量和常量池,这也是为什么static可以“对象名。成员名”调用的原因),一些指向其他对象的指针(对象不能嵌套,多维数组的相关语法来源于此)。因为方法区没有指针指向堆,所以非static成员你不能用类名。成员名调用。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-21
Node类为嵌套类,加上static后为静态嵌套类。嵌套类不能直接实例化,必须由父类对象实例化。
即在没有static 的情况下,必须通过new Main().new Node() 来实例化。静态嵌套类可单独实例化,不依赖父对象。
第2个回答  2011-11-21
public class Test2 {
public class Node{
int x=1;
}
int x=1;
public static void main(String[] args) {
Node Now = new Test2().new Node();
System.out.print(Now.x);
}

}
不加static 可以通过new Main().new Node() 来实例化;加了static就可以直接实例化;
这是嵌套类的用法。
第3个回答  2011-11-21
没看错吧,类上能加static吗;static在类中修饰变量或方法成为静态的
不能修饰类,应该是其他的地方错了
第4个回答  2011-11-21
因为主方法是static的 静态方法必须放在静态类里面~~~反之一样
相似回答