现在的位置: 首页 > 综合 > 正文

java匿名内部类

2012年12月20日 ⁄ 综合 ⁄ 共 5802字 ⁄ 字号 评论关闭

        记得JAVA中抽象类是不能创建实例的,但是在代码中总会看见new 抽象类名的用法。如果不太清楚这个原因,需要了解匿名抽象类这个概念。

        匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。Java中内部匿名类用的最多的地方也许就是在Frame中加入Listner了吧。如下:

import java.awt.*;   
import java.awt.event.*;   
  
public class QFrame extends Frame {   
    public QFrame() {   
           this.setTitle(\"my application\");   
  
           addWindowListener(new WindowAdapter() {   
                   public void windowClosing(WindowEvent e) {   
                   dispose();   
                   System.exit(0);   
                }   
            });     
  
          this.setBounds(10,10,200,200);   
     }   
}

上面的new语句,建立一个 WindowAdapter对象 ,后面一个 {} 表示这个括号中的操作作用于这个默认的对象。打开 WindowAdapter 的代码可以发现,它是一个抽象类。它是对 WindowListener 接口的一个实现。

(1)怎样判断一个匿名类的存在?看不见名字,感觉只是父类new出一个对象而已。

 先看段伪代码
abstract class Father(){
      ....
}
public class Test{
      Father f1 = new Father(){ .... }  //这里就是有个匿名内部类
}

        一般来说,new 一个对象时小括号后应该是分号,也就是new出对象该语句就结束了。但是出现匿名内部类就不一样,小括号后跟的是大括号,大括号中是该new 出对象的具体的实现方法。因为我们知道,一个抽象类是不能直接new 的,必须先有实现类了我们才能new出它的实现类。上面的伪代码就是表示new 的是Father的实现类,这个实现类是个匿名内部类。其实拆分上面的匿名内部类可为:
class SonOne extends Father{
       ...//这里的代码和上面匿名内部类,大括号中的代码是一样的
}
public class Test{
       Father f1 = new SonOne() ;
}

(2)匿名内部类的注意事项

     A,匿名内部类不能有构造方法。

     B,匿名内部类不能定义任何静态成员、方法和类。

     C,匿名内部类不能是public,protected,private,static。 

     D,只能创建匿名内部类的一个实例。

     E,一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。 
     F,因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

     G,匿名类和内部类中的中的this:有时候,我们会用到一些内部类和匿名类。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。

(3)匿名内部类实例

        本实例通过距离感应器感应值的变化来打印消息或者操作(比如解锁),开始按钮注册sensor listener,取消按钮反注册listner。抽象类定义如下:

public abstract class TestGene {
	public final static String TAG = "gene";
	public final static int INVALID_MODE = 0;
	public final static int ACTION_TO_UNLOCK_MODE = 16; // 动作解锁
	
	private static enum TestGene_actions{
		ACTION11,
		ACTIONMAX,
	}
	public final static int ACTION_TO_UNLOCK_ACTION = TestGene_actions.ACTION11.ordinal();
	public int mMode = INVALID_MODE;
	public abstract void onAction(int action, Object params);  //该抽象类要完成的抽象函数
	private Context mContext = null;
	
	private interface TestGeneMode {
		public abstract void start();
		public abstract void stop();
	}
	private TestGeneMode mTestGeneMode = null;
	
	private void __setCurTestGeneMode(int mode){
		mMode = mode;
		switch (mMode) {
		case ACTION_TO_UNLOCK_MODE:
			mTestGeneMode = new TestGeneImplActionToUnlock();   //这里对抽象类的构造,相当于对内部接口的构造了
			break;
		default:
			break;
		}
	}
	
	public TestGene(Context context, int mode) {
		mContext = context;
		__setCurTestGeneMode(mode);
	}
	
	public void start() {
		Log.v(TAG,"TestGene start");
		synchronized(this) {
			if (mTestGeneMode != null) {
				mTestGeneMode.start();   //通过构造指向不同接口的抽象类变量,执行不同的start
				Log.v(TAG,"mTestGeneMode.start");
			}
		}
	}
	
	public void stop() {
		Log.v(TAG,"TestGene stop");
		synchronized(this) {
			if (mTestGeneMode != null) {
				mTestGeneMode.stop();
				Log.v(TAG,"mTestGeneMode.stop");
			}
		}
	}
	
	private void doActionProxy(int action, Object params) {
		Log.v(TAG,"doActionProxy");
		synchronized(this) {
			if(action < TestGene_actions.ACTIONMAX.ordinal()) {
				onAction(action, params);    //虚函数的实现在具体匿名内部类定义时完成(调用和定义在不同文件中)
				Log.v(TAG,"onAction");
			} else {
				Log.v(TAG,"no Action");
			}
		}
	}
	
	public static class TestGeneImplActionToUnlockResult {
		public long diff;
		public TestGeneImplActionToUnlockResult(long diff) {
			this.diff = diff;
		}
	}
	
	private class TestGeneImplActionToUnlock implements TestGeneMode{   //实现接口的一个内部子类
		private static final String LOG_TAG = "gene";
		
		private static final long __LOW_LAST_DIFF_TIME_THRESHOLD_LOW = 50; // ms
		private static final long __LOW_LAST_DIFF_TIME_THRESHOLD_HIGH = 300; // frankie, 2013.02.06
				
		private SensorManager senMgr;
		private Sensor proxSensor;
		private boolean isProxListenerReg = false;
		private float __last_value = 1;
		private boolean first_flag = true;
		private long __last_time = 0;
		private long __cur_diff = 0;
		
			// non-arguments constructor
		public TestGeneImplActionToUnlock() {  //在构造子类时完成的初始化,在__setCurTestGeneMode看出
			senMgr = (SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);
			proxSensor = senMgr.getDefaultSensor(Sensor.TYPE_PROXIMITY);		
			isProxListenerReg = false;		
		}
		@Override
		public void start() {
			// data initializing
			first_flag = true;
			
			// start listening
			if(senMgr == null) {
				return ;
			}
			if(proxSensor == null)
				return ;
			if(isProxListenerReg == true)
				return ;
			Log.v(LOG_TAG, "TestGeneImplActionToUnlock start!");
			senMgr.registerListener(proxListener, proxSensor, SensorManager.SENSOR_DELAY_GAME);
			isProxListenerReg = true;
		}
		@Override
		public void stop() {
			if(senMgr == null)
				return ;
			if(proxSensor == null)
				return ;
			if(isProxListenerReg == false)
				return ;
			Log.v(LOG_TAG, "TestGeneImplActionToUnlock stop!");
			senMgr.unregisterListener(proxListener, proxSensor);
			isProxListenerReg = false;
		}
		
		private boolean isBetween(long v, long min, long max) {
			if(v >= min && v <= max)
				return true;
			return false;
		}
		private SensorEventListener proxListener = new SensorEventListener() {
			@Override
			public void onAccuracyChanged(Sensor sensor, int accuracy) {
			}
			@Override
			public void onSensorChanged(SensorEvent event) {  
				if(__last_value != event.values[0]) {
					if(__last_value != 0 && event.values[0] == 0) { // falling edge
						__last_time = event.timestamp;
					} else if(__last_value == 0 && event.values[0] != 0) { // raising edge
						__cur_diff = event.timestamp - __last_time;
						__cur_diff = __cur_diff/1000000;
						Log.i(LOG_TAG, "__cur_diff = " + __cur_diff);
						// check it!
						if(isBetween(__cur_diff,
							__LOW_LAST_DIFF_TIME_THRESHOLD_LOW,
							__LOW_LAST_DIFF_TIME_THRESHOLD_HIGH)) {
							doActionProxy(ACTION_TO_UNLOCK_ACTION,
								new TestGeneImplActionToUnlockResult(__cur_diff));
						}
					}
					__last_value = event.values[0];
				}
			}
		};
	}
}

      activity的调用部分,如下:

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_flash_light_main);
		
		__mContext = this;
		gene = new KonkaGene(__mContext, KonkaGene.ACTION_TO_UNLOCK_MODE) {  //创建匿名内部类,看起来像是new的抽象类,其实从构造函数中实现new的抽象类的一个内部接口子类
			public void onAction(int action, Object params){   //对应具体子类的虚函数实现 
				if(KonkaGene.ACTION_TO_UNLOCK_ACTION == action){
					Log.i(TAG,"detectd run");
				}
			}
		};
		
		Button button = (Button) findViewById(R.id.button1);
		Button button2 = (Button) findViewById(R.id.button2);
		
		button.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v)
			{
				if(gene != null) {
					Log.v(TAG, "button.__gene_start()");
					gene.start();   //注册listener
				}
			}
		});
		
		button2.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v)
			{
				if(gene != null) {
					Log.v(TAG, "button.__gene_stop()");
					gene.stop();
				}
			}
		});
	}

参考原文:http://www.cnblogs.com/PatrickLee/archive/2012/08/22/2650971.html

抱歉!评论已关闭.