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

原文: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,生不生成外部类对象都没关系)



时间: 2024-08-06 09:11:44

java静态类声明--java类可以声明为static吗的相关文章

java基本语法day01_09变量的声明与使用

概念: 内存中的一个存储区域. 该区域拥有自己的名称(变量名)和类型(数据类型). java是强类型语言,java中每个变量必须先声明后使用. 该区域的数据可以在同一类型范围内不断变化. 注意: 变量的作用域:在一对{}之间有效. 初始化值 定义变量的格式:数据类型 变量名 = 初始化值 变量是通过变量名来访问这块区域的. 变量按作用域(被声明的位置)进行分类: 1.成员变量:在方法的外部.类的内部定义的变量(也叫全局变量).在一个类的任意地方都可以被访问. 局部变量:在方法或语句块的内部定义的

类的声明和访问级别

类声明 类声明的位置 1.命名空间内 2.创建另一个自己的命名空间 3.在命名空间外声明类,实际声明在全局命名空间 4. 在类内声明类,成为一个类的成员类 声明即定义(c#,java) c,c++声明与定义分开,也可以合并在一起. 最简单的类声明 class-modifyers(opt类修饰符) class identify {class body} 类修饰符 new 适用于嵌套类 internal(在类库内可访问),protected,internal,private 修饰符将控制类的可访问性

JAVA API(一)String类和StringBuffer类

1.String类和StringBuffer类 在程序中经常会用到字符串,所谓的字符串就是指一连串的字符,它是由多个单个字符连接而成的.字符串中可以包含任意字符,这些字符必须包含在一对双引号""之内,如"abc".在Java中定义了String和StringBuffer类来封装字符串,并提供了一系列操作字符串的方法,它们都位于java.lang包中,因此不需要导包就可以直接使用.下面将对String类和StringBuffer类详细讲解. 1.1String类的初始

利用反射——查看类的声明

/** *类的声明包括常见修饰符(public.protected.private.abstract.statc.final等). * 类的名称.类的泛型参数.类的集成类(实现的接口)和类的注解等 * Class类的实例表示正在运行的Java应用程序中的类和接口. * 枚举是一种类,注解是一种接口 * 每个数组属于被映射为Class对象的一个类,所有具有相同元素类型和维数的数组都共享该Class对象. * Java的基本类型和关键字void也表示为Class对象,但没有构造方法 * Class对

[Java学习笔记]-Java对象和类

Java是完全面向对象的高级语言,其基本的操作基本都是针对相应的对象和类.面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分.对应面向对象的语言,还有一种面向过程的语言,如C语言.面向对象的语言是在面向过程语言的基础上发展而来的.面向对象(OOP,全称为Object-Oriented-Programer,下文简称为OOP)相对于面向过程的语言而言,其优势在于很多问题的解决方法被封装在对象里,有时只需要创建这样的对象就可以解决我们的问题,而不必关心其具体实现细节,这

Java学习笔记_25_Collections类

25.Collections类: Collections类是一个工具类,用来对集合进行操作,它主要是提供一些排序算法,包括随机排序.反相排序等. Collections类提供了一些静态方法,实现了基于List容器的一些常用算法. Collections的一些方法列表: · void sort(List): 对List内的元素进行排序. · void shuffle(List): 对List内的元素随机排序. · void reverse(List): 对List内的元素进行逆序排列. · voi

《深入理解java虚拟机》:类的初始化

深入理解java虚拟机>:类的初始化 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.其中验证.准备.解析3个部分统称为连接.类加载的过程包括了加载.验证.准备.解析.初始化五个阶段. 加载.验证.准备.初始化和卸载这5个阶段的顺序时确定的,类的加载过程必须按照这种顺序按部就班的开始,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定).另外注意这里的

Java解惑五:类之谜

本文是依据JAVA解惑这本书,做的笔记.电子书见:http://download.csdn.net/detail/u010378705/7527721 谜题46 函数重载的问题. JAVA重载解析过程:1. 选取全部可用的方法或者构造器:2. 从过程1中选取的方法或构造器中选择最精确的. 一般而言:能够强制要求编译器选择一个精确的重载版本号,将实參转型为形參所声明的类型. 谜题47 继承中静态域的问题. 静态域由声明它的类及其全部子类共享. 假设须要让每个子类都具有某个域的单独拷贝,必须在每个子

Java利器之UML类图详解

前言 UML(Unified Modeling Language)中文统一建模语言,是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的.面向对象的.软件密集系统的制品的开放方法.UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效. [维基百科] 最近看一些开源项目的时候,总是看到UML中的类图,一开始自己的做法就是跳过去类图的部分,不过后来又遇到了几次,就决定学习下,不能再选择逃避了,这也是一个即将优秀的程序探索者应该必备的