Android(Java)内部类的表示

举报
yd_221104950 发表于 2020/12/02 23:38:16 2020/12/02
【摘要】 有时时候我们会看到诸如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); } }); }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

上面有一个命名的内部类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())); } });

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

匿名内部类就是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); } });

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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

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

希望对大家有所帮助。

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/107177565

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。