public class DemoTest {
public static void main(String[] args) {
show();//Error, //Cannot make a static reference to the non-static method show() from the type DemoTest
}
public void show(){
}
}
作者: 王陶成 时间: 2012-9-19 23:52
Person p=new Person("lisi");
p或得了 Person在内存中的地址,指向了person类,引用了person 的地址,
p.show(); 是通过引用调用普通方法的,并不是静态方法直接调用的,这样是可以的。
public class One {
public static void main(String[] args) {
One_2.say(); //静态方法还可以通过类名调用,普通方法则不能
say();//这个是直接调用静态方法
}
public static void say() {
One_2 o = new One_2();
o.x = 3;
System.out.println(o.x);
}
}
class One_2 {
int x = 5;
public static void say() {
System.out.println("one_2");
}
} 作者: 李建强 时间: 2012-9-20 04:17
这个问题,你首先要知道为什么main()不能调用非静态方法:
前提是变量只有在内存中才能被访问,
静态成员(方法、变量)在类加载时分配内存,
非静态成员(方法、变量)是类的对象所拥有的,需要类对象实例化后,分配内存。
静态访问非静态出错是因为静态出现的比非静态出现的早,不能访问一个还不存在的东西不是?
总结就是:静态成员不能直接访问非静态成员,需要等到非静态成员存在于内存中时才可以,
main()需要等获得一个对象的引用,然后通过这个引用调用非静态成员。
这样说的话,可以理解一些吗?作者: 汪小照 时间: 2012-9-20 07:51
你是通过创建对象调用的p.show(),而没有直接调用show(),所以你的程序编译不会报错,并且运行正常。作者: 罗雪梅 时间: 2012-9-20 07:57
一个类就是一种数据类型,当你在主函数中声明了这种数据类型了就是可以用了,就相当于,你在主函数中声明 int[] arr=new int[10]; 这个变量也不是静态的,但是你声明了就可以使用,和这个道理是一样的,只要你能理解这句话,并且知道一个类就是一种数据类型就明白了