Java internal class

Source: Internet
Author: User
Tags mremote

 

1. Member internal class

A Member's internal class is a member of an external class. You can directly use all the Members and methods of the external class, even private. At the same time, to access all member variables/methods of the internal class, the external class needs to be obtained through the internal class object.

Note that the internal class of a member cannot contain static variables and methods. Because the internal class of a member needs to first create an external class to create its own class, you can understand more things and omit more details here. When the internal class of a member references an external Class Object, use outer. this indicates an external class object. You can use outer to create an internal class object. 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);} // we recommend that you use getxxx () to obtain the internal class of the member. In particular, if the constructor of the internal class has no parameter, public Inner getInner () {return new Inner ();} public class Inner {public void print (String str) {System. out. println (str );}}}

2. Local internal class

 

A local internal class is defined in the method and scope. Use outer. this to indicate the external Class Object. Note that the name is of the final type, and the final must be added to the local internal class to use the parameter name. Thinking in Java provides two examples:

Defined in the 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;public String getName() {return nameStr;}}return new InnerImp();     } } interface Inner {     String getName(); } 

 


Defined in scope:

 

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 internal class

 

Nested internal classes are internal classes modified to static. An internal class declared as static does not need to be linked between an internal class object and an external class object, that is, we can directly reference outer. inner, that is, you do not need to create external classes or internal classes. There is another difference between a nested class and a common internal class: a common internal class cannot have static data or static attributes, nor can it contain Nested classes, but a nested class can. The nested class cannot be declared as private. It is generally declared as public for convenient calling.

A static internal class is an internal class modified to static. It cannot reference members or methods of an external class. It cannot be declared as public. It is generally declared as private.

Static internal class, which can contain static members and methods, but cannot.

To generate a static internal 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 Stub 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 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;}@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 internal class

 

Anonymous internal class, which uses outer. this to represent external class objects.

 

((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();     } });

 

 

Compared with the first example of local internal class, you can clearly understand the meaning of the local internal 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 {     String getName(); } 

 

 

There are also parameters:
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(); } 

There is also an example frequently encountered in aidl:

 

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.

 

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.