日期:2014-05-20  浏览次数:20817 次

关于static的一些疑惑
今天老师上课讲的关于static的一些问题,还有些不懂,故来请教各位。
首先,老师举了个例子:
class Duck{
  private int size;
  public static void main(String[] args){
  System.out.println("Size is"+getSize());
  }
  public int getSize(){
  return size;
  }
 }
好了,老师说不能在静态方法中调用非静态成员变量,还说,成员变量是在堆中产生,由于没有new 一个实例变量,JVM找不到size到底是哪个…………开头我相信了。。
后面老师又讲到静态变量存储在静态存储区。我就在想,是不是调用静态方法时,编译器或者JVM只在静态存储区上找变量,所以才是上面的例子不能通过呢?
然后,我就有了如下举例(自己想的):
 class Duck{
 private int size;
  public int getSize(){
  return size;
  }
  }
class DuckTest{
  Duck d=new Duck();
  public static void main(String[] args){
  System.out.println("Size is"+d.getSize());
  }
}
这又有问题了,eclipse又报错了,d 要声明为static 。这时我已经new了一个对象d,JVM应该能找到是d的size了吧??可是为什么还是有错呢???是我哪里想错了??还是真的是像我说的一样,调用静态方法时,编译器或者JVM只在静态存储区上找变量,找不到静态变量所以才会报错呢??

------解决方案--------------------

如上图,因为size是非静态的变量,他是存在于对象中的,当你new一个Duck的时候就会出现一个size,new几个就会出现几个,所以如果静态方法直接去调用getSize当然会找不到你该返回哪个size。除非你把size定义成静态的static,那样size就独立存在与static区,就和任何Duck没有关系了,就可以直接调用了。
------解决方案--------------------
类的生命周期没有理解,建议楼主去看看java 编程思想,里面有些小例子,能避免很多误区,不过楼主敢于思考还是值得学习