• 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是一个抽象类。

  • 相关阅读:
    ExtJS小技巧
    Oracle 表的行数、表占用空间大小,列的非空行数、列占用空间大小 查询
    NPM 私服
    IDEA 不编译java以外的文件
    SQL 引号中的问号在PrepareStatement 中不被看作是占位符
    Chrome 浏览器自动填表呈现淡黄色解决
    批量删除Maven 仓库未下载成功.lastupdate 的文件
    Oracle 11g 监听很慢,由于监听日志文件太大引起的问题(Windows 下)
    Hibernate 自动更新表出错 建表或添加列,提示标识符无效
    Hibernate 自动更新表出错 More than one table found in namespace
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5096462.html
Copyright © 2020-2023  润新知