有时时候我们会看到诸如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:

.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:

.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类中定义了内部类,又没有使用的话,它的信息是不会出现在堆中的。

希望对大家有所帮助。