作者:简单爱

Java中的abstract,static,final修饰符

abstract修饰符

 Abstract是Java中的一个重要关键字,可以用来修饰一个类或者一个方法。修饰一个方法时,表示该方法只有特征签名(signature),没有具体实现,而是把具体实现留给继承该类的子类。一个类中只要有一个abstract方法,那么这个类就要被声明为abstract,但是其中可以有非 abstract方法。

   abstract类可以使得类的设计者能够创建方法的原型,而真正的实现留给使用这个类的人。

   继承一个abstract类的子类,要么实现父类的所有abstract方法,要么也声明为abstract类,这时仍然可以保留一些abstract方法,把具体实现留给下一级的子类。

    abstract类和接口一样,不能创建它们的实例.一个抽象类即使有公共的构造函数,也无法通过new直接创建实例.因为既然它是抽象类,就至少有一个抽象方法,因此必须创建该抽象类的一个子类(通常为内部匿名类)实现其中的抽象方法。 

      Abstract修饰符表示所修饰的类没有完全实现,还不能实例化。如果在类的方法声明中使用abstract修饰符,表明该方法是一个抽象方法,它需要在子类实现。如果一个类包含抽象函数,则这个类也是抽象类,必须使用abstract修饰符,并且不能实例化。

    在下面的情况下,类必须是抽象类:

    1.类中包含一个明确声明的抽象方法;

    2.类的任何一个父类包含一个没有实现的抽象方法;

    3.类的直接父接口声明或者继承了一个抽象方法,并且该类没有声明或者实现该抽象方法。

    如下例所示:

  

abstract class a1 
      
     { 
      
         public int v1; 
      
         abstract void test(); 
      
     } 
      
     abstract class a2 extends a1 
      
     { 
      
         public int v2; 
      
     } 
      
     class Sample extends v2 
      
     { 
      
         void test() { } 
      
     }

    因为包含一个抽象方法test,类v1必须被声明为抽象类。它的子类v2继承了抽象方法test,但没有实现它,所以它也必须声明为抽象类。然而,v2的子类Sample因为实现了test,所以它不必声明为抽象的。

    注意:

    如果试图创建一个抽象类的实例就会产生编译错误;

    如果一个类是非抽象类却包含一个抽象方法,就会产生编译错误;

    构造函数和静态函数以及Final修饰的函数不能使用abstract修饰符;

    接口缺省为abstract。

Static修饰符     

通常,在创建类的实例时,每个实例都会创建自己实例变量。但是在变量的声明中可以使用Static修饰符,它表明该成员变量属于类本身,独立于类产生的任何对象。这种成员变量称为静态变量(静态属性)。方法的声明中也可以使用static修饰符,表明该方法从属于类本身。     在静态成员函数中只能直接调用其它的静态成员函数或引用静态属性,否则会造成编译错误。静态成员函数中也不能使用this或者super,因为它们是和类的对象相关联的。     

静态属性和静态方法不需要创建实例就可以使用。     

典型的例子是java.lang包中的System类中的方法和变量。

我们常用    

System.out.println(“message”);

输出信息,并没有创建System的实例,是因为println方法声明为System类的静态方法,它不需创建实例就可以使用。     下面的例子会帮助你更深刻的理解Static修饰符。注意各个代码块的加载次序。    

Class Sample     {         static int s1=3;         static int s2;         static void display()         {             System.out.println("s1="+s1);             System.out.println("s2="+s2);         }         static