Android(Java)内部类的表示

2022-08-08,,

有时时候我们会看到诸如MainActivity$MyHandler或MainActivity$1、MainActivity$2这些带美元符号的名称,它们是什么意思。今天我来和大家说一下。在Java中,如果内部类是有名称的,则在$后加名称,否则按出现的顺序依次编号,如$1、$2、$3…
我们以下面这个例子来说明一下:

package com.wong.ex;

public class MainActivity extends AppCompatActivity{

    private TextView mTV;
    private MainModel model;
    private MyHandler myHandler = new MyHandler(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTV = findViewById(R.id.tv);
        model = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MainModel.class);
        model.getDataBean().observe(this, new Observer<DataBean>() {
            @Override
            public void onChanged(DataBean dataBean) {
                if(TextUtils.isEmpty(dataBean.getData())) return;
                mTV.setText(Html.fromHtml(dataBean.getData()));
            }
        });

        run("https://www.baidu.com");
      }

    private static class MyHandler extends  Handler{
        private MainActivity activity;
        public MyHandler(MainActivity activity){
            this.activity = activity;
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 1:
                    activity.handleResponse((String)msg.obj );
                    break;
            }
        }
    }

    private void handleResponse(String str){
        if(model != null){
            model.doAction(str);
        }
    }
    private void run(final String url) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                String str = response.body().string();
                Message message = myHandler.obtainMessage();
                message.what = 1;
                message.obj = str;
                myHandler.sendMessage(message);
            }
        });
    }
}

上面有一个命名的内部类MyHandler,所以有会标记为MainActivity$MyHandler
还有两个匿名内部类:
匿名内部类1:

 model.getDataBean().observe(this, new Observer<DataBean>() {
            @Override
            public void onChanged(DataBean dataBean) {
                if(TextUtils.isEmpty(dataBean.getData())) return;
                mTV.setText(Html.fromHtml(dataBean.getData()));
            }
        });

匿名内部类就是new Observer(){},因为按顺序它最先出现,所以它会标记为MainActivity$1

匿名内部类2:

  client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                String str = response.body().string();
                Message message = myHandler.obtainMessage();
                message.what = 1;
                message.obj = str;
                myHandler.sendMessage(message);
            }
        });

匿名内部类是new Callback() {},因为按顺序,它是第二个出现的,所以它会被标记为MainActivity$2

这些标记会出现在堆信息中,但是如果在Java类中定义了内部类,又没有使用的话,它的信息是不会出现在堆中的。

希望对大家有所帮助。

本文地址:https://blog.csdn.net/weixin_40763897/article/details/107177565

《Android(Java)内部类的表示.doc》

下载本文的Word格式文档,以方便收藏与打印。