java静态类声明--java类可以声明为static吗

来源:互联网 发布:手机的编程游戏平台 编辑:程序博客网 时间:2024/05/18 18:55

原文:http://www.javaworld.com/article/2077372/learn-java/static-class-declarations.html  

为了理解static关键字在类声明中的使用,首先我们需要了解类声明。有两种类,一种是top-level class;一种是inner class。

Top-level classes

top-level class可以被声明为包成员,每一个top-level类对应于一个文件名与类名相同的java文件。

因为top-level class已经是top-level,所以没必要声明为static。如果把top-level class声明为static,编译器会报错。

Inner classes

 在top-level class中可以定义inner class,根据inner class定义方式的不同,inner class可以有如下四种形式:

1. Anonymous:匿名类的声明和初始化在同一条语句中。匿名类没有类名,并且只能被实例化一次。例子如下:
okButton.addActionListener( new ActionListener(){   public void actionPerformed(ActionEvent e){      dispose();   }});

因为匿名类没有标准的类声明,所以不可以声明为static。

2. Local.

局部类就像局部变量一样,它的创建和使用都在一个代码块中。一旦你在代码块中声明类,那么在这个代码块中你就可以多次实例化该类。就像局部变量一样,局部类不能声明为public,private,protected或static。

例子如下:

//some code block .......{   class ListListener implements ItemListener {      List list;      public ListListener(List l) {         list = l;      }      public void itemStateChanged(ItemEvent e) {         String s = l.getItemSelected();         doSomething(s);      }   }   List list1 = new List();   list list2 = new List();   list1.addItemListener(new ListListener(list1));   list2.addItemListener(new ListListener(list2));}
3. Member.

成员类是定义在另一类中的。在包含该成员类的类中,成员类可以在任意一处位置使用。

成员内部类是唯一可以声明为static类,当把成员类声明为static的时候,它就变成top-level class。

例子如下:

//外部类class Out {    private int age = 12;         //内部类    class In {        public void print() {            System.out.println(age);        }    }} public class Demo {    public static void main(String[] args) {        Out.In in = new Out().new In();        in.print();        //或者采用下种方式访问        /*        Out out = new Out();        Out.In in = out.new In();        in.print();        */    }}
class Out {    private int age = 12;         class In {        private int age = 13;        public void print() {            int age = 14;            System.out.println("局部变量:" + age);            System.out.println("内部类变量:" + this.age);            System.out.println("外部类变量:" + Out.this.age);        }    }} public class Demo {    public static void main(String[] args) {        Out.In in = new Out().new In();        in.print();    }}
内部类在没有同名成员变量和局部变量的情况下,内部类会直接访问外部类的成员变量,而无需指定Out.this.属性名

否则,内部类中的局部变量会覆盖外部类的成员变量。

4. Nested top-level.

nested top-level class是带static修饰符的成员类。netsted top-level class可以非常方便的把相关类组织到一起,而不需要创建新包。

例子如下:

public class Filter {   Vector criteria = new Vector();   public addCriterion(Criterion c) {      criteria.addElement(c);   }   public boolean isTrue(Record rec) {      for(Enumeration e=criteria.elements();      e.hasMoreElements();) {         if(! ((Criterion)e.nextElement()).isTrue(rec))             return false;      }      return true;   }   public static class Criterion {      String colName, colValue;      public Criterion(Stirng name, String val) {         colName = name; colValue = val;      }      public boolean isTrue(Record rec) {         String data = rec.getData(colName);         if(data.equals(colValue)) return true;         return false;      }   }}Filter f = new Filter();f.addCriterion(new Filter.Criterion("SYMBOL", "SUNW"));f.addCriterion(new Filter.Criterion("SIDE", "BUY"));.....if(f.isTrue(someRec)) //do some thing .....

可以看到,如果用static 将内部内静态化,那么内部类就只能访问外部类的静态成员变量,具有局限性

其次,因为内部类被静态化,因此Out.In可以当做一个整体看,可以直接new 出内部类的对象(通过类名访问static,生不生成外部类对象都没关系)




0 0
原创粉丝点击