一般static是不能用来修饰class的,但是如果一定要用static修饰类的话,通常修饰的是内部类。在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。由于静态的内部类在定义、使用的时候会有种种的限制。所以在实际工作中用到的并不多。
在开发过程中,内部类中使用的最多的还是非静态地成员内部类。不过在特定的情况下,静态内部类也能够发挥其独特的作用。
宿主类的静态方法或静态成员变量(static修饰的方法或变量)可以实例化静态内部类(当然非静态方法也可以实例化静态内部类),但是相反静态方法或静态成员变量不可以实例化非静态内部类。
静态类使用的区别: 一是静态成员
(
包括静态变量与静态成员
)
的定义。一般情况下,
如果一个内部类不是被定义成静态内部类,那么在定义成员变量或者成员方法的时候,是不能够被定为静态成员方法的而静态成员变量必须用户final关键字修饰。
也就是说,在非静态内部类中不可以声明非final静态成员。
二是成员的引用上。一般的非静态内部类,可以随意的访问外部类中的成员变量与成员方法。即使这些成员方法被修饰为private(私有的成员变量或者方法),其非静态内部类都可以随意的访问,这是非静态内部类的特权。因为在其他类中是无法访问被定义为私有的成员变量或则方法。在静态内部类中,无论在成员方法内部还是在其他地方,都只能够引用外部类中的静态的变量,而不能够访问非静态的变量。无论在内部类的什么地方引用,即都只能够引用外部类中的静态成员方法或者成员变量。
三是在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。通常情况下,在一个类中创建成员内部类的时候,有一个强制性的规定,即内部类的实例一定要绑定在外部类的实例中。也就是说,在创建内部类之前要先在外部类中要利用new关键字来创建这个内部类的对象。如此的话如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。也就是说,普通非静态内部类的对象是依附在外部类对象之中的。但是,如果成员开发人员创建的时静态内部类,那么这就又另当别论了。通常情况下,程序员在定义静态内部类的时候,是不需要定义绑定在外部类的实例上的。也就是说,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。即在创建静态类内部对象时,不需要其外部类的对象。
/**
* StaticClass.java
* Created at 2014年9月9日
* Created by mengfanyuan
* Copyright (C) 2014 SHANGHAI KALVENMENG, All rights reserved.
*/
package com.mfy.test.testclass;
/**
*
* ClassName: StaticClass
*
*
* Description: TODO
*
*
* Author: mengfanyuan
* Email:kalvenmeng@163.com
*
*
* Date: 2014年9月9日
*
*/
public class StaticClass {
/**
*
* Field str1: 非静态成员变量
*
*/
private String str1 = "";
/**
*
* Field str2: 静态成员变量
*
*/
static String str2 = "";
/**
*
* Field ic03: 成员变量实例化静态内部类
*
*/
private static InnerClass1 ic03 = new InnerClass1();
/**
*
* Field ic04: 成员变量实例化非静态内部类
*
*/
//private static InnerClass2 ic04 = new InnerClass2(); //编译不通过
/**
*
*Description: 静态成员方法
*
*
*/
public static void t1() {
InnerClass1 ic1 = new InnerClass1();
//InnerClass2 ic2 = new InnerClass2();//编译不通过
}
/**
*
*Description: 非静态成员方法
*
*
*/
public void t2() {
InnerClass1 ic1 = new InnerClass1();
InnerClass2 ic2 = new InnerClass2();
}
/**
*
* ClassName: InnerClass1
*
*
* Description: 静态内部类
*
*
* Author: kalvenmeng
*
*
* Date: 2014年9月9日
*
*/
public static class InnerClass1 {
/**
*
* Field s1: 引用宿主非静态成员变量
*
*/
//String s1 = str1; //编译不通过
/**
*
* Field s2: 引用宿主静态成员变量
*
*/
String s2 = str2;
public static String dafaultName = "kalvel";
private String name ;
public void setName(String name) {
this.name = name;
}
public void sayHello1() {
System.out.println(name + "says \"hello\" to you !!!!");
}
public static void defaultSayHello() {
System.out.println(dafaultName + "says \"hello\" to you !!!!");
}
}
/**
*
* ClassName: InnerClass2
*
*
* Description: 非静态内部类
*
*
* Author: kalvenmeng
*
*
* Date: 2014年9月9日
*
*/
public class InnerClass2 {
//public static String dafaultName = "kalvel";//编译不通过
public final static String dafaultName = "kalvel";
private String name ;
public void setName(String name) {
this.name = name;
}
public void sayHello1() {
System.out.println(name + "says \"hello\" to you !!!!");
}
//编译不通过
/*public static void defaultSayHello() {
System.out.println(dafaultName + "says \"hello\" to you !!!!");
}*/
}
public static void main(String[] args) {
InnerClass1 ic1 = new StaticClass.InnerClass1();
//InnerClass2 ic2 = new InnerClass2();//编译不通过;
StaticClass sc = new StaticClass();
InnerClass2 ic2 = sc.new InnerClass2();
}
}