代码改变世界

static和this的理解和用法小结

2006-03-20 12:03  Jeff  阅读(3456)  评论(0编辑  收藏  举报
关键字staticthis是初学者比较头疼的知识点,自己也一直比较模糊.现在整理一下,既可以加深自己的印象也可以便于以后查询.

       其实在think in java里关于为什么要使用static写的比较详细,不明白的多读几遍会有很大的收获.一般在两钟情形下需要使用static关键字:一种情形是只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一起.所以尽管从未创建那个类的一个对象,仍能调用一个static方法,或访问一些static数据。而在这之前,对于非static数据和方法,我们必须创建一个对象,并用那个对象访问数据或方法。这是由于非static数据和方法必须知道它们操作的具体对象.有这样的一个类,其中定义一个静态数据:
    class Test {
    Static int i = 47;
    }
    Test st1 = new StaticTest();
  Test st2 = new StaticTest();
  即使们new了两个Test对象,但它们仍然只占据Test.i的一个存储空间。这两个对象都共享同样的i。对方法来说,static一项重要的用途就是帮助我们在不必创建对象的前提下调用那个方法.
  

静态变量)
  一个静态对象属于一个类,但它不属于实例对象,也不是实例对象状态的一部分.每一个静态变量只存在一份.静态变量通常称为类变量(class variable).在实际中,经常需要这样的一个变量,它被一个类的所有实例对象所共享,如果它同时又是公有的,那么它就可以被这个类的任意访问者所使用.静态变量存在于类的作用域之内.通常声明为private.java中许多时候会用到public static final 这样的变量。
     
静态变量可以被位于同一个作用域内的任意方或静态方法访问,访问时使用变量名称即可。如果在类作用域以外访问类,则要使用一个含有类名的表达式访问静态变量,例如:
   Integer.MAX_VALUE, 
其中MAX_VALUE是在类库中声明过的。

 静态方法)
      
静态方法或类方法属于一个而不是属于某个实例对象实现的一部分。可以直接通过类来调用这种方法,而并不是只能由某个特定的实例对象调用。静态的方法不能用abstract声明,而且无论是否明确地指定实际上都是final型的。
  
静态方法的声明格式:
   modifiers static typeName methodName (parameterList){
   statementSequence
   }
   modifiers(
可以从public,protect,private中选择一个),后面可以加上final,nativc,synchronized中的一个或几个的组合。
   static main
是静态方法的一个特殊用法,用static main 方法来建立程序的初始状态,创建一组初始对象,并进行合理的方法调用,使得程序能够继续执行下去,static main方法使用String数组型参数包含了用户在运行时给出的任意命令行参数。


静态初始化器)
  
静态初始初始化器(static initializer)时一个语句序列,在装入一个类时执行它。我们用它来初始化静态变量,并且苦于完成一个类所需的其他初始化工作。静态变量可以被直接初始化,但是要进行更复杂的初始化,就需要静态初始化器。它提供了一种与实例变量初始化类似的机制。形式:
   static{ statementSequence}
  

关于this.
   this
关键字(注意只能在方法内部使用)。This是一个final变量,在构造函数,实例方法和实例初始化器中被自动声明。它持有对调用该构造函数,方法或者初始化器的对象的一个引用。this的类型就是这个对象的引用的类型。
   (1)
当一个实例变量有可能被嵌套范围内的一个参数名称覆盖时:
   class example
   void f
int x//parameter x hides the instance variable
   {
   this.x=x    //this.x used to acess to the hidden instance variable
   }
   ...
   pravite int x=4;
   }
   (2)
传递一个当前的对象的引用给其他类的其他方法:
   {
   ...
   A a = new A();
   ...
   a.f(this);/pass this to method f of class A
   ...
   }
   (3)
在构造函数相互关联的情况下,使用this可以让一个构造函数调用另外一个构造函数。用法是在一个this表达式后面追加一个位于括号中的参数列表,就可以调用与参数列表相匹配的构造函数。
   public Test
(){
   this(10);//
调用另一个int型的函数
   }
  
若准备从自己某个类的另一个方法内部调用一个类方法。就不必使用this。只需简单地调用那个方法即可。当前的this句柄会自动应用于其他方法。
  
写的可能不详细,以后遇到再补充吧!