代码改变世界

Java的内部静态类

2011-05-27 13:51  会被淹死的鱼  阅读(934)  评论(0编辑  收藏  举报

Java的内部类语法比较复杂,只有内部静态类,而没有静态类。

public class Hello {
	public class Child {
		public Child() {}
		public void sayHello() {
			System.out.println("Hello from child!");
		}
	}
	
	public static void main(String[] args) {
		System.out.println("Hello, World!");
		Hello h = new Hello();
		Child child = h.new Child();
		child.sayHello();
	}
}

上面的例子用到了.new的语法,因为main是个静态方法,所以Hello类不会被初始化,Child类也不会被加载到内存中,必须显示地初始化Hello类,然后使用.new的语法来初始化内部类。当然还可以使用内部静态类。

public final class Hello {
	public static class Child {
		public Child() {
		}

		public void sayHello() {
			System.out.println("Hello from child!");
		}
	}

	public static void main(String[] args) {
		System.out.println("Hello, World!");
		Child child = new Hello.Child();
		child.sayHello();
	}
}

这里因为内部的Child类是static,所以即使Hello没有初始化,Child也已经加载到内存中了。

这样的处理方式和类中的static成员是一致的,内部类可以随意的访问外部类,这是内部类最大的特点。

public class Outter {
	public class Inner {
		private int in = 3;
		public void print() {
			System.out.println(Outter.this.out);
		}
	}
	
	private int out = 4;
	
	public void print() {
		System.out.println(new Inner().in);
	}
	
	public static void main(String[] args) {
		new Outter().new Inner().print();
	}
}

诡异的内部类语法

内部类的使用,下面是一个command模式的例子,摘自Java编程思想(Thinking in java)

Event.java

public abstract class Event {
	private long eventTime;
	protected final long delayTime;
	public Event(long delayTime) {
		super();
		this.delayTime = delayTime;
		start();
	}
	
	public void start() {
		eventTime = System.nanoTime() + delayTime;
	}
	
	public boolean ready() {
		return System.nanoTime() >= eventTime;
	}
	
	public abstract void action();
}

Controller.java

import java.util.ArrayList;
import java.util.List;

public class Controller {
	private List<Event> eventList = new ArrayList<Event>();
	public void addEvent(Event c) {
		eventList.add(c);
	}
	public void run() {
		while (eventList.size() > 0) {
			for (Event e : new ArrayList<Event>(eventList)) {
				if (e.ready()) {
					System.out.println(e);
					e.action();
					eventList.remove(e);
				}
			}
		}
	}
}

GreenhouseControls.java

public class GreenhouseControls extends Controller {
	private boolean light = false;
	
	public class LightOn extends Event {
		public LightOn(long delayTime) {
			super(delayTime);
		}

		@Override
		public void action() {
			light = true;
		}
		
		@Override
		public String toString() {
			return "Light is on.";
		}
	}
	
	public class LightOff extends Event {
		public LightOff(long delayTime) {
			super(delayTime);
		}

		@Override
		public void action() {
			light = false;
		}
		
		@Override
		public String toString() {
			return "Light is off.";
		}
	}
	
	private boolean water = false;
	public class WaterOn extends Event {
		public WaterOn(long delayTime) {
			super(delayTime);
		}

		@Override
		public void action() {
			water = true;
		}
		
		@Override
		public String toString() {
			return "Water is on.";
		}
	}
	
	public class WaterOff extends Event {
		public WaterOff(long delayTime) {
			super(delayTime);
		}

		@Override
		public void action() {
			water = false;
		}
		
		@Override
		public String toString() {
			return "Water is off.";
		}
	}
	
	// 恒温器 空调
	private String thermostat = "Day";
	public class ThermostatNight extends Event {

		public ThermostatNight(long delayTime) {
			super(delayTime);
		}

		@Override
		public void action() {
			thermostat = "Night";
		}
		
		@Override
		public String toString() {
			return "Thermostat on night setting.";
		}
	}
	
	public class ThermostatDay extends Event {

		public ThermostatDay(long delayTime) {
			super(delayTime);
		}

		@Override
		public void action() {
			thermostat = "Day";
		}
		
		@Override
		public String toString() {
			return "Thermostat on day setting.";
		}
	}
	
	public class Bell extends Event {

		public Bell(long delayTime) {
			super(delayTime);
		}

		@Override
		public void action() {
			addEvent(new Bell(delayTime));
		}
		
		@Override
		public String toString() {
			return "Bing!";
		}
	}
	
	public class Restart extends Event {
		private Event[] eventList;
		public Restart(long delayTime, Event[] eventList) {
			super(delayTime);
			this.eventList = eventList;
			for (Event e : eventList)
				addEvent(e);
		}

		@Override
		public void action() {
			for (Event e: eventList) {
				e.start();
				addEvent(e);
			}
			start();
			addEvent(this);
		}
		@Override
		public String toString() {
			return "Restarting system.";
		}
	}
	
	public static class Terminate extends Event {

		public Terminate(long delayTime) {
			super(delayTime);
		}

		@Override
		public void action() {
			System.exit(0);
		}

		@Override
		public String toString() {
			return "Terminating.";
		}
	}
}

GreenhouseController.java

public class GreenhouseController {
	public static void main(String[] args) {
		GreenhouseControls gc = new GreenhouseControls();
		gc.addEvent(gc.new Bell(900));
		
		Event[] eventList = {
				gc.new ThermostatNight(0),
				gc.new LightOn(200),
				gc.new LightOff(400),
				gc.new WaterOn(600),
				gc.new WaterOff(800),
				gc.new ThermostatDay(1400)
		};
		
		gc.addEvent(gc.new Restart(2000, eventList));
		
		if (args.length == 1) {
			gc.addEvent(new GreenhouseControls.Terminate(new Integer(args[0])));
		}
		gc.run();
	}
}
上述的内部类实现command模式,还是比较优雅的。