References http://android.blog.51cto.com/268543/384844
1. member Inner class
The member inner class. is to be a member of an external class. All members and methods of an external class can be used directly. Even if it's private. At the same time an external class is required to access all member variables/methods of the inner class, which is obtained through an object of the inner class.
It is important to note that the member inner class cannot contain static variables and methods. Because the member inner class needs to create the outer class first, the ability to create its own, to understand this, you can clear a lot of other things, here omit a lot of other details. When a member is inside a class to reference an external class object. use Outer.this to represent external class objects , and to create an inner class object that can use 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"); } A personal recommendation is to use GETXXX () to get the member inner class. In particular, the constructor of the inner class has no parameters when public Inner Getinner () { return new Inner (); } public class Inner {public void print (String str) { System.out.println (str); }
2. Local inner class
A local inner class, which refers to an inner class definition within a method and scope. use Outer.this to represent external class objects , Note that name is the final type. The local inner class uses the formal name, which must be added to final. Thinking in Java gives such two examples:
Defined within a method:
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;pub Lic String GetName () {return nameStr;}} return new Innerimp (); } } interface Inner {
Defined in scope:
public class Parcel5 { private void internaltracking (Boolean b) { if (b) { class Trackingslip { private St Ring 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 internal class
Nested inner classes. is the inner class that is decorated as static. An inner class declared as static does not require a connection between an inner class object and an Outer class object, which means that we can refer directly to Outer.Inner, that is, there is no need to create an external class, nor do we need to create an inner class.
Another difference between nested classes and ordinary inner classes is that ordinary inner classes cannot have static data and static properties, nor can they include nested classes, but nested classes can. Nested classes cannot be declared private, and are generally declared public for easy invocation.
A static inner class is an inner class that is decorated as static and cannot reference the members and methods of an external class.
cannot be declared as private, and is generally declared public.
A static inner class that can include static members and methods. and the member inner class cannot.
Suppose you want to generate a static inner class. 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 S Tub extends Android.os.Binder implementsandroid.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 to 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;} @Overridepublic 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. Anonymous inner class
Anonymous inner class. use Outer.this to represent an external class object.
(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 (); } });
The meaning of local inner classes can be clearly understood against the first example of a local inner class:
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 {
There are also a number of references:
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 = NA Me; Public String GetName () { return nameStr; } };} } Abstract class Inner { Inner (string name, String city) { System.out.println (city); }
Another kind of aidl, often encountered in the example:
Private Iacceleraterservice.stub Mbinder = new Iacceleraterservice.stub () {@Overridepublic void Stop () throws remoteexception {MACCSERVICEMANAGER.STOPACC ();} @Overridepublic 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);}} @Overridepublic int Resume () throws RemoteException {return Maccservicemanager.resumeacc ();} @Overridepublic int Pause () throws RemoteException {return Maccservicemanager.pauseacc ();} @Overridepublic int isavailable () throws RemoteException {return maccservicemanager.isaccavailable ();} @Overridepublic int Gethttpproxyport () throws RemoteException {return Maccservicemanager.getacchttpproxyport ();} @Overridepublic Boolean isaccenable () throws RemoteException {return acceleraterservicemanager.isaccenable ();} @OveRridepublic String Getaccport () throws remoteexception {return acceleraterservicemanager.acc_port;} @Overridepublic String Getversionname () throws RemoteException {return acceleraterservicemanager.getaccversionname () ;} @Overridepublic int Getversioncode () throws RemoteException {return Acceleraterservicemanager.getaccversioncode ();} @Overridepublic int Getcurrentstatus () throws RemoteException {return maccservicemanager.getcurrentstatus ();}};Iacceleraterservice.stub is an abstract class.
Java Internal Classes