对于java的的对象理解尼,平时我们看书都是感觉很快就理解了,但是实际上还是偶尔有一些坑会坑到自己的,今天主要怎么说尼,我今天写了一段代码,主要的功能就是从服务器那边获得数据并显示出来,这边的服务器部分代码如下面所表示
[{ "equipmentId": "092219031002", "sid": 3, "equipmentName": "092219031002", "equipmentQrcode": null, "createTime": 1564540391000, "updateTime": 1564540391000, "guns": [ { "gid": "09221903100201", "state": 0, "updateTime": null }, { "gid": "09221903100202", "state": 0, "updateTime": 1565280000000 } ] },
{...
}]
这边是因为服务器里面返回来的里面有两个数组,所以我用了两个for循环来获得到gid的数据显示
代码的话开始如下面所表示:(此代码是错误的,这会导致最后列表显示的数据都是最后一个对象设置的数据)
JSONObject data = object1.getJSONObject("data"); JSONArray content = data.getJSONArray("content"); for (int i =0;i<content.size();i++){ JSONObject o = content.getJSONObject(i); String equipmentId = o.getString("equipmentId"); // String equipmentState = o.getString("state"); JSONArray content1 = o.getJSONArray("guns"); List<Gun> gunList = new ArrayList<>(); Gun gun = new Gun();// 注意注意,这个就是错误的由来,由于这边是在for循环之前设置了一个对象 for (int i1=0;i1<content1.size();i1++){ JSONObject o1 = content1.getJSONObject(i1); String mGid = o1.getString("gid"); int mState = Integer.parseInt(o1.getString("state")); gun.setGid(mGid);//对象是同一个存放发的地方,所以后面改变的时候都改变了改变之前设置的值 gun.setState(mState); gunList.add(gun); } EquipmentMsg equipmentMsg = new EquipmentMsg(); equipmentMsg.setEquipmentId(equipmentId); equipmentMsg.setGuns(gunList);
根据我的逻辑呢,我的想法就是在想要在通过里面一个for循环然后把服务器中对应的guns里面的对象都设置给自己的模型类后,再添加到一个列表中,然后再把列表赋给外面的一个类,从而可以得到与服务器数据交流的效果,但是却忘记了此时的gun其实都是同一个对象,这说明我们在后面把后面得到的数据设置给它的时候其实也就是会把前面的数据也改变了,这是因为同一个对象指向的都是同一个内存的,所以梗了,数据永远都是后面最后一个数据,而这样的错误是因为自己对java理解不够的原因,之前也有大该这边的思路,但是因为设置的都是基本类型的,而基本类型大多都是在获取时就设置类型,所以就避免了这个错误的展示,知道问题所在了,那么就可以来进行修改了,
就是把那个Gun gun = new Gun();放入里面的for循环中去,此时在for循环时是建立不同的对象的,也就是有着不同的存储位置,这样也就可以完成我们想要得到的逻辑,改后代码如下面所展示
for (int i =0;i<content.size();i++){ JSONObject o = content.getJSONObject(i); String equipmentId = o.getString("equipmentId"); JSONArray content1 = o.getJSONArray("guns"); List<Gun> gunList = new ArrayList<>(); for (int i1=0;i1<content1.size();i1++){ JSONObject o1 = content1.getJSONObject(i1); String mGid = o1.getString("gid"); Gun gun = new Gun();// 这个就是主要的修改的地方,此时就是不同对象了 int mState = Integer.parseInt(o1.getString("state")); gun.setGid(mGid); gun.setState(mState); gunList.add(gun); }
ok,这样就又解决了一个问题,果然实践是把知识运用的最好方法,日常打鸡血,加油,要想 厘米姐姐一样优秀,明年春招要去阿里工作