在最近设计服务治理模块中,涉及到以下的使用方式:css
abstract class mybase{ Map<String, String> cache = Maps.newConcurrentMap(); abstract void add(); } class mya extends mybase{ public void add (){ cache.put("a","1"); } } class myb extends mybase { public void add() { cache.put("b", "1"); } }
可是在实际使用过程当中,发现cache变量,在mya和myb这两个类中,是两个不一样的对象:html
@Test public void testx(){ mybase a = new mya(); a.add(); mybase b = new myb(); b.add(); System.out.println(a.cache); System.out.println(b.cache); }
输出结果以下:java
{a=1} {b=1}
原本咱们觉得二者输出的结果应该都是{a=1,b=1},可是结果却并不是得偿所愿。spa
出现这种问题的缘由,其实在于java自身的类继承机制。extends以后,会在子类中建立副本,从而致使不一样对象的出现。设计
若是想解决这个问题,则须要在一个公共的地方定义一个变量,而后在父类中被引用便可。code
解决方法以下:htm
@Test public void testx(){ mybase a = new mya(); a.add(); mybase b = new myb(); b.add(); System.out.println(a.map); System.out.println(b.map); } interface mycache{ Map<String, String> map = Maps.newConcurrentMap(); } abstract class mybase implements mycache{ abstract void add(); } class mya extends mybase{ public void add (){ map.put("a","1"); } } class myb extends mybase { public void add() { map.put("b", "1"); } }
输出结果为:对象
{a=1, b=1} {a=1, b=1}这样,能够看到输出符合预想了。