Android(Java)内部类的表示
【摘要】 有时时候我们会看到诸如MainActivity$MyHandler或MainActivity$1、MainActivity$2这些带美元符号的名称,它们是什么意思。今天我来和大家说一下。在Java中,如果内部类是有名称的,则在$后加名称,否则按出现的顺序依次编号,如$1、$2、$3… 我们以下面这个例子来说明一下:
package com.wong.ex;
publ...
有时时候我们会看到诸如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类中定义了内部类,又没有使用的话,它的信息是不会出现在堆中的。
希望对大家有所帮助。
文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_40763897/article/details/107177565
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)