zoukankan      html  css  js  c++  java
  • Java 内部类

    參考http://android.blog.51cto.com/268543/384844

    1、成员内部类

          成员内部类。就是作为外部类的成员。能够直接使用外部类的全部成员和方法。即使是private的。同一时候外部类要訪问内部类的全部成员变量/方法,则须要通过内部类的对象来获取。

          要注意的是,成员内部类不能含有static的变量和方法。由于成员内部类须要先创建了外部类,才干创建它自己的,了解这一点,就能够明确很多其它事情,在此省略很多其它的细节了。在成员内部类要引用外部类对象时。使用outer.this来表示外部类对象;而须要创建内部类对象,能够使用outer.inner obj = outerobj.new inner();

    public class Outer { 
        public static void main(String[] args) { 
            Outer outer = new Outer(); 
            Outer.Inner inner = outer.new Inner(); 
            inner.print("Outer.new"); 
     
            inner = outer.getInner(); 
            inner.print("Outer.get"); 
        } 
     
        // 个人推荐使用getxxx()来获取成员内部类。尤其是该内部类的构造函数无參数时 
        public Inner getInner() { 
            return new Inner(); 
        } 
     
        public class Inner { 
            public void print(String str) { 
                System.out.println(str); 
            } 
        } 
    } 

    2、局部内部类

          局部内部类,是指内部类定义在方法和作用域内。使用outer.this来表示外部类对象注意name为final类型。局部内部类要使用形參name,必须加上final。Thinking in Java给了这么两个样例:

          定义在方法内:

    public class Outer { 
        public static void main(String[] args) { 
            Outer outer = new Outer(); 
            Inner inner = outer.getInner("Inner", "gz"); 
            System.out.println(inner.getName()); 
        } 
     
        public Inner getInner(final String name, String city) { 
    	class InnerImp implements Inner {
    		private String nameStr = name;
    		
    		public String getName() {
    			return nameStr;
    		}
    	}
    
    	return new InnerImp(); 
        } 
    } 
    
    interface Inner { 
        String getName(); 
    } 


         定义在作用域里:

    public class Parcel5 { 
        private void internalTracking(boolean b) { 
            if (b) { 
                class TrackingSlip { 
                    private String id; 
                    TrackingSlip(String s) { 
                        id = s; 
                    } 
                    String getSlip() { 
                        return id; 
                    } 
                } 
                TrackingSlip ts = new TrackingSlip("slip"); 
                String s = ts.getSlip(); 
            } 
        } 
     
        public void track() { 
            internalTracking(true); 
        } 
     
        public static void main(String[] args) { 
            Parcel5 p = new Parcel5(); 
            p.track(); 
        } 
    } 

    3、静态内部类

          嵌套内部类。就是修饰为static的内部类。声明为static的内部类,不须要内部类对象和外部类对象之间的联系,就是说我们能够直接引用outer.inner,即不须要创建外部类,也不须要创建内部类。

    嵌套类和普通的内部类另一个差别:普通内部类不能有static数据和static属性,也不能包括嵌套类,但嵌套类能够。而嵌套类不能声明为private,一般声明为public,方便调用。

          静态内部类,就是修饰为static的内部类,不能引用外部类的成员和方法。

    不能声明为private,一般声明为public。

          静态内部类,能够包括static的成员和方法。而成员内部类不能。

          假设要生成静态内部类。outer.inner obj = new outerobj.inner();

    /*
     * This file is auto-generated.  DO NOT MODIFY.
     * Original file: frameworks/base/core/java/android/os/IFregService.aidl
     */
    package android.os;
    
    public interface IFregService extends android.os.IInterface {
    	/** Local-side IPC implementation stub class. */
    	public static abstract class Stub extends android.os.Binder implements
    			android.os.IFregService {
    		private static final java.lang.String DESCRIPTOR = "android.os.IFregService";
    
    		/** Construct the stub at attach it to the interface. */
    		public Stub() {
    			this.attachInterface(this, DESCRIPTOR);
    		}
    
    		/**
    		 * Cast an IBinder object into an android.os.IFregService interface,
    		 * generating a proxy if needed.
    		 */
    		public static android.os.IFregService asInterface(android.os.IBinder obj) {
    			if ((obj == null)) {
    				return null;
    			}
    			android.os.IInterface iin = (android.os.IInterface) obj
    					.queryLocalInterface(DESCRIPTOR);
    			if (((iin != null) && (iin instanceof android.os.IFregService))) {
    				return ((android.os.IFregService) iin);
    			}
    			return new android.os.IFregService.Stub.Proxy(obj);
    		}
    
    		public android.os.IBinder asBinder() {
    			return this;
    		}
    
    		@Override
    		public boolean onTransact(int code, android.os.Parcel data,
    				android.os.Parcel reply, int flags)
    				throws android.os.RemoteException {
    			switch (code) {
    			case INTERFACE_TRANSACTION: {
    				reply.writeString(DESCRIPTOR);
    				return true;
    			}
    			case TRANSACTION_setVal: {
    				data.enforceInterface(DESCRIPTOR);
    				int _arg0;
    				_arg0 = data.readInt();
    				this.setVal(_arg0);
    				reply.writeNoException();
    				return true;
    			}
    			case TRANSACTION_getVal: {
    				data.enforceInterface(DESCRIPTOR);
    				int _result = this.getVal();
    				reply.writeNoException();
    				reply.writeInt(_result);
    				return true;
    			}
    			}
    			return super.onTransact(code, data, reply, flags);
    		}
    
    		private static class Proxy implements android.os.IFregService {
    			private android.os.IBinder mRemote;
    
    			Proxy(android.os.IBinder remote) {
    				mRemote = remote;
    			}
    
    			public android.os.IBinder asBinder() {
    				return mRemote;
    			}
    
    			public java.lang.String getInterfaceDescriptor() {
    				return DESCRIPTOR;
    			}
    
    			public void setVal(int val) throws android.os.RemoteException {
    				android.os.Parcel _data = android.os.Parcel.obtain();
    				android.os.Parcel _reply = android.os.Parcel.obtain();
    				try {
    					_data.writeInterfaceToken(DESCRIPTOR);
    					_data.writeInt(val);
    					mRemote.transact(Stub.TRANSACTION_setVal, _data, _reply, 0);
    					_reply.readException();
    				} finally {
    					_reply.recycle();
    					_data.recycle();
    				}
    			}
    
    			public int getVal() throws android.os.RemoteException {
    				android.os.Parcel _data = android.os.Parcel.obtain();
    				android.os.Parcel _reply = android.os.Parcel.obtain();
    				int _result;
    				try {
    					_data.writeInterfaceToken(DESCRIPTOR);
    					mRemote.transact(Stub.TRANSACTION_getVal, _data, _reply, 0);
    					_reply.readException();
    					_result = _reply.readInt();
    				} finally {
    					_reply.recycle();
    					_data.recycle();
    				}
    				return _result;
    			}
    		}
    
    		static final int TRANSACTION_setVal = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    		static final int TRANSACTION_getVal = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
    	}
    
    	public void setVal(int val) throws android.os.RemoteException;
    
    	public int getVal() throws android.os.RemoteException;
    }

    4、匿名内部类

          匿名内部类。使用outer.this来表示外部类对象。

    ((Button) findViewById(R.id.start)).setOnClickListener(new Button.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
            new Thread() { 
     
                @Override 
                public void run() { 
                    // TODO Auto-generated method stub 
                } 
     
            }.start(); 
        } 
    });


          对照局部内部类第一个样例,就能清楚的理解局部内部类的含义:

    public class Outer { 
        public static void main(String[] args) { 
            Outer outer = new Outer(); 
            Inner inner = outer.getInner("Inner", "gz"); 
            System.out.println(inner.getName()); 
        } 
     
        public Inner getInner(final String name, String city) { 
            return new Inner() { 
                private String nameStr = name; 
     
                public String getName() { 
                    return nameStr; 
                } 
            };
        } 
    } 
    
    interface Inner { 
        String getName(); 
    } 


          还有有參数的情况:
    public class Outer { 
        public static void main(String[] args) { 
            Outer outer = new Outer(); 
            Inner inner = outer.getInner("Inner", "gz"); 
            System.out.println(inner.getName()); 
        } 
     
        public Inner getInner(final String name, String city) { 
            return new Inner(name, city) { 
                private String nameStr = name; 
     
                public String getName() { 
                    return nameStr; 
                } 
            }; 
        } 
    } 
     
    abstract class Inner { 
        Inner(String name, String city) { 
            System.out.println(city); 
        } 
     
        abstract String getName(); 
    } 

          另一种aidl中,常常碰到的样例:

    private IAcceleraterService.Stub mBinder = new IAcceleraterService.Stub() {
    		
    		@Override
    		public void stop() throws RemoteException {
    			mAccServiceManager.stopAcc();
    		}
    		
    		@Override
    		public void start() throws RemoteException {
    			int flag = mAccServiceManager.startAcc(AcceleraterService.this);
    			if (flag == 0) {
    				Intent intent = new Intent(ACTION_START_SUCCESS);
    				AcceleraterService.this.sendBroadcast(intent);
    			} else {
    				Intent intent = new Intent(ACTION_START_FAILURE);
    				AcceleraterService.this.sendBroadcast(intent);
    			}
    		}
    		
    		@Override
    		public int resume() throws RemoteException {
    			return mAccServiceManager.resumeAcc();
    		}
    		
    		@Override
    		public int pause() throws RemoteException {
    			return mAccServiceManager.pauseAcc();
    		}
    		
    		@Override
    		public int isAvailable() throws RemoteException {
    			return mAccServiceManager.isAccAvailable();
    		}
    		
    		@Override
    		public int getHttpProxyPort() throws RemoteException {
    			return mAccServiceManager.getAccHttpProxyPort();
    		}
    		
    		@Override
    		public boolean isACCEnable() throws RemoteException {
    			return AcceleraterServiceManager.isACCEnable();
    		}
    
    		@Override
    		public String getAccPort() throws RemoteException {
    			return AcceleraterServiceManager.ACC_PORT;
    		}
    
    		@Override
    		public String getVersionName() throws RemoteException {
    			return AcceleraterServiceManager.getAccVersionName();
    		}
    
    		@Override
    		public int getVersionCode() throws RemoteException {
    			return AcceleraterServiceManager.getAccVersionCode();
    		}
    
    		@Override
    		public int getCurrentStatus() throws RemoteException {
    			return mAccServiceManager.getCurrentStatus();
    		}
    
    };
         IAcceleraterService.Stub是一个抽象类。

  • 相关阅读:
    ios8消息快捷处理——暂无输入框
    animateWithDuration 动画的速度选择
    对网页进行修改js代码
    如何对网页进行长截图
    centos快速配置yum源
    No module named 'Crypto.PublicKey' 完美解决办法
    Virtualenv 环境配置
    Python逻辑运算符的本质
    Django 使用Contenttype组件创建多关联数据库表
    Django Rest Framework url注册器组件 | 响应器组件 | 分页器组件
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5096462.html
Copyright © 2011-2022 走看看