在最近設計服務治理模塊中,涉及到以下的使用方式: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}這樣,能夠看到輸出符合預想了。