对static关键字的用法还是不是很理解,在think in java中有这么一段代码class Bowl
{
   Bowl(int er) 
  {
    System.out.println("Bowl(" + er + ")");
  }
  void f1(int er) 
  {
    System.out.println("f1(" + er + ")");
  }
}
class Table 
{
  static Bowl bowl1 = new Bowl(1);
  Table() 
  {
     System.out.println("Table()");
     bowl2.f1(1);
  }
  void f2(int er) 
  {
    System.out.println("f2(" + er + ")");
  }
  static Bowl bowl2 = new Bowl(2);
}
class Cupboard 
{
  Bowl bowl3 = new Bowl(3);
  static Bowl bowl4 = new Bowl(4);
  Cupboard()
  {
    System.out.println("Cupboard()");
    bowl4.f1(2);
  }
  void f3(int er)
  {
    System.out.println("f3(" + er + ")");
  }
  static Bowl bowl5 = new Bowl(5);
}
public class StaticInitialization 
{
  public static void main(String[] args) 
  {
    System.out.println("Creating new Cupboard() in main");
    new Cupboard();
    System.out.println("Creating new Cupboard() in main");
    new Cupboard();
    table.f2(1);
    cupboard.f3(1);
  }
  static Table table = new Table();
  static Cupboard cupboard = new Cupboard();
}
这样可以编译执行,但是我把public class里面的最后两条语句static Table table = new Table();
static Cupboard cupboard = new Cupboard();放在main方法里就不行了,希望老师们给予解答

解决方案 »

  1.   

    在函数里是不能声明静态变量的,就像不能声明private ..一样。
      

  2.   

    static用来修饰成员变量和成员方法,也可以形成静态static代码块
      

  3.   

    本人觉得static修饰符使得变量的生命周期属于类,在类装载时变量才会被初始化且只初始化一次,而楼主把static放到方法里面就成为局部变量,而局部变量只有在调用该宿主方法时才会被初始化,要知道JVM应该先装载.class文件即装载类后调用main方法作为入口,明显与static修饰符的意义矛盾,以上仅是各人愚见,说的不对敬请各位高人指点
      

  4.   

    Static关键字的用途就是在创建类的时候就给特定的成员或者方法分配存储空间。当程序员在成员变量或者方法前面加上Static关键字时,就表示这些成员与方法不会与包含它的那个类的任何对象实例关联在一起。换一句话就是说,即使没有创建这个类的对象,程序员仍然可以调用这个类中的成员或者方法。因为他们实际上已经存在,系统已经为他们分配了存储空间。不过需要注意的是,Static关键字定义的成员与方法,毕竟与传统的对象创建方法有所差异。所以无论是在定义时还是在具体的引用过程中,都有所差异。程序开发人员必须了解这种差异,并在实际的工作中要引起重视。特别是如果有其他语言开发经验的程序员,不要将Java语言的这个特性与其他语言搞混,否则的话很容易出现错误。   利用Static关键字来定义成员方法。  利用Static关键字来定义静态的成员方法,其实跟静态成员变量的定义类似。只需要在某个方法前面加上关键字static即可。不过在内部的实现机制上,两个还是有差别的。从以上的分析中可以看出,当将某个成员变量定义为静态变量时,其实内部数据创建的方式得到了改变。因为正常情况下,非静态成员变量每个对象都有一个存储空间,也就是说一个类如果有多少个对象则这个成员变量就有多少个存储空间。而如果成员变量设置为静态变量时,则一个类中的一个静态成员变量只有一个存储空间。即使这个类创建了数百个对象,但是这个对象中的静态成员变量也只有一个存储空间。这就是静态成员变量与非静态成员变量的主要差异。但是如果将某个方法定义为静态方法的话,差别就没有这么大。这主要是因为方法只涉及到调用,很少涉及到存储空间的分配。  而至于这个静态方法的调用,跟静态变量的调用相同。即可以利用对象名来调用,也可以利用类名来调用。同理,笔者建议是采用类名来调用,这可以强调静态方法的静态性。另外需要注意的是,创建静态方法的一个重要的用途就是在不创建任何对象的情况下,就来调用静态的方法。此时就只能够通过类名来调用这个静态方法。因为对象根本没有被创建。   所以如果static关键字用于修饰成员变量,即把这个变量设置为静态变量,这主要是用来解决多个对象共享同一个变量的需求。而将某个方法设置为静态方法,这主要是用来在不创建任何对象的情况下就可以使用某个方法。故静态变量与静态方法虽然实现与引用的方式相同,但是两者解决问题的侧重点是不同的。
      

  5.   

    static声明的变量不能在方法体里面!
      

  6.   


    静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。这样做有什么意义呢? 
    在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是有种情况例外,就是该成员是用static声明的(在这里所讲排除了类的访问控制)
    static 属性可以被static和非static类型的方法使用
    非static属性不能够被static方法所使用静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间static变量有点类似于C中的全局变量的概念