聽聽聽 鎻愯搗Java鍐呴儴綾伙紙Inner Class錛夊彲鑳藉緢澶氫漢涓嶅お鐔熸?zhèn)夊Q屽疄闄呬笂綾諱技鐨勬蹇靛湪C++閲屼篃鏈夛紝閭e氨鏄祵濂楃被錛圢ested Class錛夛紝鍏充簬榪欎袱鑰呯殑鍖哄埆涓庤仈緋伙紝鍦ㄤ笅鏂囦腑浼氭湁瀵規(guī)瘮銆傚唴閮ㄧ被浠庤〃闈笂鐪嬶紝灝辨槸鍦ㄧ被涓張瀹氫箟浜嗕竴涓被錛堜笅鏂囦細鐪嬪埌錛屽唴閮ㄧ被鍙互鍦ㄥ緢澶氬湴鏂瑰畾涔夛級錛岃屽疄闄呬笂騫舵病鏈夐偅涔堢畝鍗曪紝涔嶇湅涓婂幓鍐呴儴綾諱技涔庢湁浜涘浣欙紝瀹冪殑鐢ㄥ瀵逛簬鍒濆鑰呮潵璇村彲鑳藉茍涓嶆槸閭d箞鏄捐憲錛屼絾鏄殢鐫瀵瑰畠鐨勬繁鍏ヤ簡瑙o紝浣犱細鍙戠幇Java鐨勮璁¤呭湪鍐呴儴綾昏韓涓婄殑紜槸鐢ㄥ績鑹嫤銆傚浼氫嬌鐢ㄥ唴閮ㄧ被錛屾槸鎺屾彙Java楂樼駭緙栫▼鐨勪竴閮ㄥ垎錛屽畠鍙互璁╀綘鏇翠紭闆呭湴璁捐浣犵殑紼嬪簭緇撴瀯銆備笅闈粠浠ヤ笅鍑犱釜鏂歸潰鏉ヤ粙緇嶏細
聽聽聽 絎竴嬈¤闈?/strong>
public interface Contents {
聽聽聽 int value();
}
public interface Destination {
聽聽聽 String readLabel();
}
public class Goods {
聽聽聽 private class Content implements Contents {
聽聽聽聽聽聽聽 private int i = 11;
聽聽聽聽聽聽聽 public int value() {
聽聽聽聽聽聽聽聽聽聽聽 return i;
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 protected class GDestination implements Destination {
聽聽聽聽聽聽聽 private String label;
聽聽聽聽聽聽聽 private GDestination(String whereTo) {
聽聽聽聽聽聽聽聽聽聽聽 label = whereTo;
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 public String readLabel() {
聽聽聽聽聽聽聽聽聽聽聽 return label;
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 public Destination dest(String s) {
聽聽聽聽聽聽聽 return new GDestination(s);
聽聽聽 }
聽聽聽 public Contents cont() {
聽聽聽聽聽聽聽 return new Content();
聽聽聽 }
}
class TestGoods {
聽聽聽 public static void main(String[] args) {
聽聽聽聽聽聽聽 Goods p = new Goods();
聽聽聽聽聽聽聽 Contents c = p.cont();
聽聽聽聽聽聽聽 Destination d = p.dest("Beijing");
聽聽聽 }
}
聽聽聽 鍦ㄨ繖涓緥瀛愰噷綾籆ontent鍜孏Destination琚畾涔夊湪浜嗙被Goods鍐呴儴錛屽茍涓斿垎鍒湁鐫protected鍜宲rivate淇グ絎︽潵鎺у埗璁塊棶綰у埆銆侰ontent浠h〃鐫Goods鐨勫唴瀹癸紝鑰孏Destination浠h〃鐫Goods鐨勭洰鐨勫湴銆傚畠浠垎鍒疄鐜頒簡涓や釜鎺ュ彛Content鍜孌estination銆傚湪鍚庨潰鐨刴ain鏂規(guī)硶閲岋紝鐩存帴鐢?Contents c鍜孌estination d榪涜鎿嶄綔錛屼綘鐢氳嚦榪炶繖涓や釜鍐呴儴綾葷殑鍚嶅瓧閮芥病鏈夌湅瑙侊紒榪欐牱錛屽唴閮ㄧ被鐨勭涓涓ソ澶勫氨浣撶幇鍑烘潵浜嗏曗曢殣钘忎綘涓嶆兂璁╁埆浜虹煡閬撶殑鎿嶄綔錛屼篃鍗沖皝瑁呮с?
聽聽聽 鍚屾椂錛屾垜浠篃鍙戠幇浜嗗湪澶栭儴綾諱綔鐢ㄨ寖鍥翠箣澶栧緱鍒板唴閮ㄧ被瀵硅薄鐨勭涓涓柟娉曪紝閭e氨鏄埄鐢ㄥ叾澶栭儴綾葷殑鏂規(guī)硶鍒涘緩騫惰繑鍥炪備笂渚嬩腑鐨刢ont()鍜宒est()鏂規(guī)硶灝辨槸榪欎箞鍋氱殑銆傞偅涔堣繕鏈夋病鏈夊埆鐨勬柟娉曞憿錛熷綋鐒舵湁錛屽叾璇硶鏍煎紡濡備笅錛?/p>
聽聽聽 outerObject=new outerClass(Constructor Parameters);
聽聽聽 outerClass.innerClass innerObject=outerObject.new InnerClass(Constructor Parameters);
聽聽聽 娉ㄦ剰鍦ㄥ垱寤洪潪闈欐佸唴閮ㄧ被瀵硅薄鏃訛紝涓瀹氳鍏堝垱寤鴻搗鐩稿簲鐨勫閮ㄧ被瀵硅薄銆傝嚦浜庡師鍥狅紝涔熷氨寮曞嚭浜嗘垜浠笅涓涓瘽棰樷曗?/p>
聽聽聽 闈為潤鎬佸唴閮ㄧ被瀵硅薄鏈夌潃鎸囧悜鍏跺閮ㄧ被瀵硅薄鐨勫紩鐢?/strong>
聽聽聽 瀵瑰垰鎵嶇殑渚嬪瓙紼嶄綔淇敼錛?/p>
public class Goods {
聽聽聽 private valueRate=2;
聽聽聽 private class Content implements Contents {
聽聽聽聽聽聽聽 private int i = 11*valueRate;
聽聽聽聽聽聽聽 public int value() {
聽聽聽聽聽聽聽聽聽聽聽 return i;
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 protected class GDestination implements Destination {
聽聽聽聽聽聽聽 private String label;
聽聽聽聽聽聽聽 private GDestination(String whereTo) {
聽聽聽聽聽聽聽聽聽聽聽 label = whereTo;
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 public String readLabel() {
聽聽聽聽聽聽聽聽聽聽聽 return label;
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 public Destination dest(String s) {
聽聽聽聽聽聽聽 return new GDestination(s);
聽聽聽 }
聽聽聽 public Contents cont() {
聽聽聽聽聽聽聽 return new Content();
聽聽聽 }
}
聽聽聽 淇敼鐨勯儴鍒嗙敤钃濊壊鏄劇ず浜嗐傚湪榪欓噷鎴戜滑緇橤oods綾誨鍔犱簡涓涓猵rivate鎴愬憳鍙橀噺valueRate錛屾剰涔夋槸璐х墿鐨勪環(huán)鍊肩郴鏁幫紝鍦ㄥ唴閮ㄧ被Content鐨勬柟娉晇alue()璁$畻浠峰兼椂鎶婂畠涔樹笂銆傛垜浠彂鐜幫紝value()鍙互璁塊棶valueRate錛岃繖涔熸槸鍐呴儴綾葷殑絎簩涓ソ澶勨曗曚竴涓唴閮ㄧ被瀵硅薄鍙互璁塊棶鍒涘緩瀹冪殑澶栭儴綾誨璞$殑鍐呭錛岀敋鑷沖寘鎷鏈夊彉閲忥紒榪欐槸涓涓潪甯告湁鐢ㄧ殑鐗規(guī)э紝涓烘垜浠湪璁捐鏃舵彁渚涗簡鏇村鐨勬濊礬鍜屾嵎寰勩傝鎯沖疄鐜拌繖涓姛鑳斤紝鍐呴儴綾誨璞″氨蹇呴』鏈夋寚鍚戝閮ㄧ被瀵硅薄鐨勫紩鐢ㄣ侸ava緙栬瘧鍣ㄥ湪鍒涘緩鍐呴儴綾誨璞℃椂錛岄殣寮忕殑鎶婂叾澶栭儴綾誨璞$殑寮曠敤涔熶紶浜嗚繘鍘誨茍涓鐩翠繚瀛樼潃銆傝繖鏍峰氨浣垮緱鍐呴儴綾誨璞″緇堝彲浠ヨ闂叾澶栭儴綾誨璞★紝鍚屾椂榪欎篃鏄負浠涔堝湪澶栭儴綾諱綔鐢ㄨ寖鍥翠箣澶栧悜瑕佸垱寤哄唴閮ㄧ被瀵硅薄蹇呴』鍏堝垱寤哄叾澶栭儴綾誨璞$殑鍘熷洜銆?/p>
聽聽聽 鏈変漢浼氶棶錛屽鏋滃唴閮ㄧ被閲岀殑涓涓垚鍛樺彉閲忎笌澶栭儴綾葷殑涓涓垚鍛樺彉閲忓悓鍚嶏紝涔熷嵆澶栭儴綾葷殑鍚屽悕鎴愬憳鍙橀噺琚睆钄戒簡錛屾庝箞鍔烇紵娌′簨錛孞ava閲岀敤濡備笅鏍煎紡琛ㄨ揪澶栭儴綾葷殑寮曠敤錛?/p>
outerClass.this
聽聽聽 鏈変簡瀹冿紝鎴戜滑灝變笉鎬曡繖縐嶅睆钄界殑鎯呭喌浜嗐?/p>
聽聽聽 闈欐佸唴閮ㄧ被
聽聽聽 鍜屾櫘閫氱殑綾諱竴鏍鳳紝鍐呴儴綾諱篃鍙互鏈夐潤鎬佺殑銆備笉榪囧拰闈為潤鎬佸唴閮ㄧ被鐩告瘮錛屽尯鍒氨鍦ㄤ簬闈欐佸唴閮ㄧ被娌℃湁浜嗘寚鍚戝閮ㄧ殑寮曠敤銆傝繖瀹為檯涓婂拰C++涓殑宓屽綾誨緢鐩稿儚浜嗭紝Java鍐呴儴綾諱笌C++宓屽綾繪渶澶х殑涓嶅悓灝卞湪浜庢槸鍚︽湁鎸囧悜澶栭儴鐨勫紩鐢ㄨ繖涓鐐逛笂錛屽綋鐒朵粠璁捐鐨勮搴︿互鍙婁互瀹冧竴浜涚粏鑺傛潵璁茶繕鏈夊尯鍒?/p>
聽聽聽 闄ゆ涔嬪錛屽湪浠諱綍闈為潤鎬佸唴閮ㄧ被涓紝閮戒笉鑳芥湁闈欐佹暟鎹紝闈欐佹柟娉曟垨鑰呭張涓涓潤鎬佸唴閮ㄧ被錛堝唴閮ㄧ被鐨勫祵濂楀彲浠ヤ笉姝竴灞傦級銆備笉榪囬潤鎬佸唴閮ㄧ被涓嵈鍙互鎷ユ湁榪欎竴鍒囥傝繖涔熺畻鏄袱鑰呯殑絎簩涓尯鍒惂銆?/p>
聽聽聽 灞閮ㄥ唴閮ㄧ被
聽聽聽 鏄殑錛孞ava鍐呴儴綾諱篃鍙互鏄眬閮ㄧ殑錛屽畠鍙互瀹氫箟鍦ㄤ竴涓柟娉曠敋鑷充竴涓唬鐮佸潡涔嬪唴銆?/p>
public class Goods1 {
聽聽聽聽 public Destination dest(String s) {
聽聽聽聽聽聽聽聽聽 class GDestination implements Destination {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 private String label;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 private GDestination(String whereTo) {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 label = whereTo;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 public String readLabel() { return label; }
聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽聽 return new GDestination(s);
聽聽聽聽 }
聽聽聽聽 public static void main(String[] args) {
聽聽聽聽聽聽聽聽聽 Goods1 g= new Goods1();
聽聽聽聽聽聽聽聽聽 Destination d = g.dest("Beijing");
聽聽聽聽 }
}
聽聽聽 涓婇潰灝辨槸榪欐牱涓涓緥瀛愩傚湪鏂規(guī)硶dest涓垜浠畾涔変簡涓涓唴閮ㄧ被錛屾渶鍚庣敱榪欎釜鏂規(guī)硶榪斿洖榪欎釜鍐呴儴綾葷殑瀵硅薄銆傚鏋滄垜浠湪鐢ㄤ竴涓唴閮ㄧ被鐨勬椂鍊欎粎闇瑕佸垱寤哄畠鐨勪竴涓璞″茍鍒涚粰澶栭儴錛屽氨鍙互榪欐牱鍋氥傚綋鐒訛紝瀹氫箟鍦ㄦ柟娉曚腑鐨勫唴閮ㄧ被鍙互浣胯璁″鏍峰寲錛岀敤閫旂粷涓嶄粎浠呭湪榪欎竴鐐廣?/p>
聽聽聽 涓嬮潰鏈変竴涓洿鎬殑渚嬪瓙錛?/p>
public class Goods2{
聽聽聽聽 private void internalTracking(boolean b) {
聽聽聽聽聽聽聽聽聽 if(b) {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 class TrackingSlip {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 private String id;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 TrackingSlip(String s) {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 id = s;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 String getSlip() { return id; }
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 TrackingSlip ts = new TrackingSlip("slip");
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 String s = ts.getSlip();
聽聽聽聽聽聽聽聽聽 }
聽聽聽聽 }
聽聽聽聽 public void track() { internalTracking(true); }
聽聽聽聽 public static void main(String[] args) {
聽聽聽聽聽聽聽聽聽 Goods2 g= new Goods2();
聽聽聽聽聽聽聽聽聽 g.track();
聽聽聽聽 }
}
聽聽聽 浣犱笉鑳藉湪if涔嬪鍒涘緩榪欎釜鍐呴儴綾葷殑瀵硅薄錛屽洜涓鴻繖宸茬粡瓚呭嚭浜嗗畠鐨勪綔鐢ㄥ煙銆備笉榪囧湪緙栬瘧鐨勬椂鍊欙紝鍐呴儴綾籘rackingSlip鍜屽叾浠栫被涓鏍峰悓鏃惰緙栬瘧錛屽彧涓嶈繃瀹冪敱瀹冭嚜宸辯殑浣滅敤鍩燂紝瓚呭嚭浜嗚繖涓寖鍥村氨鏃犳晥錛岄櫎姝や箣澶栧畠鍜屽叾浠栧唴閮ㄧ被騫舵病鏈夊尯鍒?/p>
聽聽聽 鍖垮悕鍐呴儴綾?
聽聽聽 java鐨勫尶鍚嶅唴閮ㄧ被鐨勮娉曡鍒欑湅涓婂幓鏈変簺鍙ゆ紝涓嶈繃濡傚悓鍖垮悕鏁扮粍涓鏍鳳紝褰撲綘鍙渶瑕佸垱寤轟竴涓被鐨勫璞¤屼笖鐢ㄤ笉涓婂畠鐨勫悕瀛楁椂錛屼嬌鐢ㄥ唴閮ㄧ被鍙互浣夸唬鐮佺湅涓婂幓綆媧佹竻妤氥傚畠鐨勮娉曡鍒欐槸榪欐牱鐨勶細
聽聽聽 new interfacename(){......}; 鎴?new superclassname(){......};
聽聽聽 涓嬮潰鎺ョ潃鍓嶉潰緇х畫涓句緥瀛愶細
public class Goods3 {
聽聽聽聽 public Contents cont(){
聽聽聽聽聽聽聽聽聽 return new Contents(){
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 private int i = 11;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 public int value() {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 return i;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽聽 };
聽聽聽聽 }
}
聽聽聽 榪欓噷鏂規(guī)硶cont()浣跨敤鍖垮悕鍐呴儴綾葷洿鎺ヨ繑鍥炰簡涓涓疄鐜頒簡鎺ュ彛Contents鐨勭被鐨勫璞★紝鐪嬩笂鍘葷殑紜崄鍒嗙畝媧併?/p>
聽聽聽 鍦╦ava鐨勪簨浠跺鐞嗙殑鍖垮悕閫傞厤鍣ㄤ腑錛屽尶鍚嶅唴閮ㄧ被琚ぇ閲忕殑浣跨敤銆備緥濡傚湪鎯沖叧闂獥鍙f椂鍔犱笂榪欐牱涓鍙ヤ唬鐮侊細
frame.addWindowListener(new WindowAdapter(){
聽聽聽聽 public void windowClosing(WindowEvent e){
聽聽聽聽聽聽聽聽聽 System.exit(0);
聽聽聽聽 }
});
聽聽聽 鏈変竴鐐歸渶瑕佹敞鎰忕殑鏄紝鍖垮悕鍐呴儴綾葷敱浜庢病鏈夊悕瀛楋紝鎵浠ュ畠娌℃湁鏋勯犲嚱鏁幫紙浣嗘槸濡傛灉榪欎釜鍖垮悕鍐呴儴綾葷戶鎵夸簡涓涓彧鍚湁甯﹀弬鏁版瀯閫犲嚱鏁扮殑鐖剁被錛屽垱寤哄畠鐨勬椂鍊欏繀欏誨甫涓婅繖浜涘弬鏁幫紝騫跺湪瀹炵幇鐨勮繃紼嬩腑浣跨敤super鍏抽敭瀛楄皟鐢ㄧ浉搴旂殑鍐呭錛夈傚鏋滀綘鎯寵鍒濆鍖栧畠鐨勬垚鍛樺彉閲忥紝鏈変笅闈㈠嚑縐嶆柟娉曪細
聽聽聽 1.濡傛灉鏄湪涓涓柟娉曠殑鍖垮悕鍐呴儴綾伙紝鍙互鍒╃敤榪欎釜鏂規(guī)硶浼犺繘浣犳兂瑕佺殑鍙傛暟錛屼笉榪囪浣忥紝榪欎簺鍙傛暟蹇呴』琚0鏄庝負final銆?
聽聽聽 2.灝嗗尶鍚嶅唴閮ㄧ被鏀歸犳垚鏈夊悕瀛楃殑灞閮ㄥ唴閮ㄧ被錛岃繖鏍峰畠?yōu)鍙互鎷ユ湁鏋勯犲嚱鏁頒簡銆?
聽聽聽 3.鍦ㄨ繖涓尶鍚嶅唴閮ㄧ被涓嬌鐢ㄥ垵濮嬪寲浠g爜鍧椼?
聽聽聽 涓轟粈涔堥渶瑕佸唴閮ㄧ被錛?/strong>
聽聽聽 java鍐呴儴綾繪湁浠涔堝ソ澶勶紵涓轟粈涔堥渶瑕佸唴閮ㄧ被錛?/p>
聽聽聽 棣栧厛涓句竴涓畝鍗曠殑渚嬪瓙錛屽鏋滀綘鎯沖疄鐜頒竴涓帴鍙o紝浣嗘槸榪欎釜鎺ュ彛涓殑涓涓柟娉曞拰浣犳瀯鎯崇殑榪欎釜綾諱腑鐨勪竴涓柟娉曠殑鍚嶇О錛屽弬鏁扮浉鍚岋紝浣犲簲璇ユ庝箞鍔烇紵榪欐椂鍊欙紝浣犲彲浠ュ緩涓涓唴閮ㄧ被瀹炵幇榪欎釜鎺ュ彛銆傜敱浜庡唴閮ㄧ被瀵瑰閮ㄧ被鐨勬墍鏈夊唴瀹歸兘鏄彲璁塊棶鐨勶紝鎵浠ヨ繖鏍峰仛鍙互瀹屾垚鎵鏈変綘鐩存帴瀹炵幇榪欎釜鎺ュ彛鐨勫姛鑳姐?/p>
聽聽聽 涓嶈繃浣犲彲鑳借璐ㄧ枒錛屾洿鏀逛竴涓嬫柟娉曠殑涓嶅氨琛屼簡鍚楋紵
聽聽聽 鐨勭‘錛屼互姝や綔涓鴻璁″唴閮ㄧ被鐨勭悊鐢憋紝瀹炲湪娌℃湁璇存湇鍔涖?/p>
聽聽聽 鐪熸鐨勫師鍥犳槸榪欐牱鐨勶紝java涓殑鍐呴儴綾誨拰鎺ュ彛鍔犲湪涓璧鳳紝鍙互鐨勮В鍐沖父琚獵++紼嬪簭鍛樻姳鎬╦ava涓瓨鍦ㄧ殑涓涓棶棰樷曗曟病鏈夊緇ф壙銆傚疄闄呬笂錛孋++鐨勫緇ф壙璁捐璧鋒潵寰堝鏉傦紝鑰宩ava閫氳繃鍐呴儴綾誨姞涓婃帴鍙o紝鍙互寰堝ソ鐨勫疄鐜板緇ф壙鐨勬晥鏋溿?br />
銆銆鏃╁湪Java 1.2鎺ㄥ嚭涔嬫椂錛孞ava騫沖彴涓氨寮曞叆浜嗕竴涓柊鐨勬敮鎸侊細java.lang.ThreadLocal錛岀粰鎴戜滑鍦ㄧ紪鍐欏綰跨▼紼嬪簭鏃舵彁渚涗簡涓縐嶆柊鐨勯夋嫨銆備嬌鐢ㄨ繖涓伐鍏風被鍙互寰堢畝媧佸湴緙栧啓鍑轟紭緹庣殑澶氱嚎紼嬬▼搴忥紝铏界劧ThreadLocal闈炲父鏈夌敤錛屼絾鏄技涔庣幇鍦ㄤ簡瑙e畠銆佷嬌鐢ㄥ畠鐨勬湅鍙嬭繕涓嶅銆? 銆銆ThreadLocal鏄粈涔?/strong> 銆銆ThreadLocal鏄粈涔堝憿錛熷叾瀹濼hreadLocal騫墮潪鏄竴涓嚎紼嬬殑鏈湴瀹炵幇鐗堟湰錛屽畠騫朵笉鏄竴涓猅hread錛岃屾槸thread local variable錛堢嚎紼嬪眬閮ㄥ彉閲忥級銆備篃璁告妸瀹冨懡鍚嶄負ThreadLocalVar鏇村姞鍚堥傘傜嚎紼嬪眬閮ㄥ彉閲忥紙ThreadLocal錛夊叾瀹炵殑鍔熺敤闈炲父綆鍗曪紝灝辨槸涓烘瘡涓涓嬌鐢ㄨ鍙橀噺鐨勭嚎紼嬮兘鎻愪緵涓涓彉閲忓肩殑鍓湰錛屾槸姣忎竴涓嚎紼嬮兘鍙互鐙珛鍦版敼鍙樿嚜宸辯殑鍓湰錛岃屼笉浼氬拰鍏跺畠綰跨▼鐨勫壇鏈啿紿併備粠綰跨▼鐨勮搴︾湅錛屽氨濂藉儚姣忎竴涓嚎紼嬮兘瀹屽叏鎷ユ湁璇ュ彉閲忋傜嚎紼嬪眬閮ㄥ彉閲忓茍涓嶆槸Java鐨勬柊鍙戞槑錛屽湪鍏跺畠鐨勪竴浜涜璦緙栬瘧鍣ㄥ疄鐜幫紙濡侷BM XL FORTRAN錛変腑錛屽畠鍦ㄨ璦鐨勫眰嬈℃彁渚涗簡鐩存帴鐨勬敮鎸併傚洜涓篔ava涓病鏈夋彁渚涘湪璇█灞傛鐨勭洿鎺ユ敮鎸侊紝鑰屾槸鎻愪緵浜嗕竴涓猅hreadLocal鐨勭被鏉ユ彁渚涙敮鎸侊紝鎵浠ワ紝鍦↗ava涓紪鍐欑嚎紼嬪眬閮ㄥ彉閲忕殑浠g爜鐩稿姣旇緝絎ㄦ嫏錛岃繖涔熻鏄嚎紼嬪眬閮ㄥ彉閲忔病鏈夊湪Java涓緱鍒板緢濂界殑鏅強鐨勪竴涓師鍥犲惂銆?/p> 銆銆ThreadLocal鐨勮璁?/strong> 銆銆棣栧厛鐪嬬湅ThreadLocal鐨勬帴鍙o細 銆銆Object get() ; // 榪斿洖褰撳墠綰跨▼鐨勭嚎紼嬪眬閮ㄥ彉閲忓壇鏈?br />聽聽聽 protected Object initialValue(); // 榪斿洖璇ョ嚎紼嬪眬閮ㄥ彉閲忕殑褰撳墠綰跨▼鐨勫垵濮嬪?br />聽聽聽 void set(Object value); // 璁劇疆褰撳墠綰跨▼鐨勭嚎紼嬪眬閮ㄥ彉閲忓壇鏈殑鍊?/p> 銆銆ThreadLocal鏈?涓柟娉曪紝鍏朵腑鍊煎緱娉ㄦ剰鐨勬槸initialValue()錛岃鏂規(guī)硶鏄竴涓猵rotected鐨勬柟娉曪紝鏄劇劧鏄負浜嗗瓙綾婚噸鍐欒岀壒鎰忓疄鐜扮殑銆傝鏂規(guī)硶榪斿洖褰撳墠綰跨▼鍦ㄨ綰跨▼灞閮ㄥ彉閲忕殑鍒濆鍊鹼紝榪欎釜鏂規(guī)硶鏄竴涓歡榪熻皟鐢ㄦ柟娉曪紝鍦ㄤ竴涓嚎紼嬬1嬈¤皟鐢╣et()鎴栬卻et(Object)鏃舵墠鎵ц錛屽茍涓斾粎鎵ц1嬈°俆hreadLocal涓殑紜疄瀹炵幇鐩存帴榪斿洖涓涓猲ull錛?/p> protected Object initialValue() { return null; } 銆銆ThreadLocal鏄浣曞仛鍒頒負姣忎竴涓嚎紼嬬淮鎶ゅ彉閲忕殑鍓湰鐨勫憿錛熷叾瀹炲疄鐜扮殑鎬濊礬寰堢畝鍗曪紝鍦═hreadLocal綾諱腑鏈変竴涓狹ap錛岀敤浜庡瓨鍌ㄦ瘡涓涓嚎紼嬬殑鍙橀噺鐨勫壇鏈傛瘮濡備笅闈㈢殑紺轟緥瀹炵幇錛?/p> public class ThreadLocal 銆public void set(Object newValue) 銆public Object initialValue() 銆銆褰撶劧錛岃繖騫朵笉鏄竴涓伐涓氬己搴︾殑瀹炵幇錛屼絾JDK涓殑ThreadLocal鐨勫疄鐜版諱綋鎬濊礬涔熺被浼間簬姝ゃ?/p> 銆銆ThreadLocal鐨勪嬌鐢?/strong> 銆銆濡傛灉甯屾湜綰跨▼灞閮ㄥ彉閲忓垵濮嬪寲鍏跺畠鍊鹼紝閭d箞闇瑕佽嚜宸卞疄鐜癟hreadLocal鐨勫瓙綾誨茍閲嶅啓璇ユ柟娉曪紝閫氬父浣跨敤涓涓唴閮ㄥ尶鍚嶇被瀵筎hreadLocal榪涜瀛愮被鍖栵紝姣斿涓嬮潰鐨勪緥瀛愶紝SerialNum綾諱負姣忎竴涓被鍒嗛厤涓涓簭鍙鳳細 public class SerialNum 銆private static int nextSerialNum = 0; 銆public static int get() 銆銆SerialNum綾葷殑浣跨敤灝嗛潪甯稿湴綆鍗曪紝鍥犱負get()鏂規(guī)硶鏄痵tatic鐨勶紝鎵浠ュ湪闇瑕佽幏鍙栧綋鍓嶇嚎紼嬬殑搴忓彿鏃訛紝綆鍗曞湴璋冪敤錛?/p> int serial = SerialNum.get(); 銆銆鍗沖彲銆?/p> 銆銆鍦ㄧ嚎紼嬫槸媧誨姩鐨勫茍涓擳hreadLocal瀵硅薄鏄彲璁塊棶鐨勬椂錛岃綰跨▼灝辨寔鏈変竴涓埌璇ョ嚎紼嬪眬閮ㄥ彉閲忓壇鏈殑闅愬惈寮曠敤錛屽綋璇ョ嚎紼嬭繍琛岀粨鏉熷悗錛岃綰跨▼鎷ユ湁鐨勬墍浠ョ嚎紼嬪眬閮ㄥ彉閲忕殑鍓湰閮藉皢澶辨晥錛屽茍絳夊緟鍨冨溇鏀墮泦鍣ㄦ敹闆嗐?/p> 銆銆ThreadLocal涓庡叾瀹冨悓姝ユ満鍒剁殑姣旇緝 銆銆ThreadLocal鍜屽叾瀹冨悓姝ユ満鍒剁浉姣旀湁浠涔堜紭鍔垮憿錛烼hreadLocal鍜屽叾瀹冩墍鏈夌殑鍚屾鏈哄埗閮芥槸涓轟簡瑙e喅澶氱嚎紼嬩腑鐨勫鍚屼竴鍙橀噺鐨勮闂啿紿侊紝鍦ㄦ櫘閫氱殑鍚屾鏈哄埗涓紝鏄氳繃瀵硅薄鍔犻攣鏉ュ疄鐜板涓嚎紼嬪鍚屼竴鍙橀噺鐨勫畨鍏ㄨ闂殑銆傝繖鏃惰鍙橀噺鏄涓嚎紼嬪叡浜殑錛屼嬌鐢ㄨ繖縐嶅悓姝ユ満鍒墮渶瑕佸緢緇嗚嚧鍦板垎鏋愬湪浠涔堟椂鍊欏鍙橀噺榪涜璇誨啓錛屼粈涔堟椂鍊欓渶瑕侀攣瀹氭煇涓璞★紝浠涔堟椂鍊欓噴鏀捐瀵硅薄鐨勯攣絳夌瓑寰堝銆傛墍鏈夎繖浜涢兘鏄洜涓哄涓嚎紼嬪叡浜簡璧勬簮閫犳垚鐨勩俆hreadLocal灝變粠鍙︿竴涓搴︽潵瑙e喅澶氱嚎紼嬬殑騫跺彂璁塊棶錛孴hreadLocal浼氫負姣忎竴涓嚎紼嬬淮鎶や竴涓拰璇ョ嚎紼嬬粦瀹氱殑鍙橀噺鐨勫壇鏈紝浠庤岄殧紱諱簡澶氫釜綰跨▼鐨勬暟鎹紝姣忎竴涓嚎紼嬮兘鎷ユ湁鑷繁鐨勫彉閲忓壇鏈紝浠庤屼篃灝辨病鏈夊繀瑕佸璇ュ彉閲忚繘琛屽悓姝ヤ簡銆俆hreadLocal鎻愪緵浜嗙嚎紼嬪畨鍏ㄧ殑鍏變韓瀵硅薄錛屽湪緙栧啓澶氱嚎紼嬩唬鐮佹椂錛屽彲浠ユ妸涓嶅畨鍏ㄧ殑鏁翠釜鍙橀噺灝佽榪汿hreadLocal錛屾垨鑰呮妸璇ュ璞$殑鐗瑰畾浜庣嚎紼嬬殑鐘舵佸皝瑁呰繘ThreadLocal銆?/p> 銆銆鐢變簬ThreadLocal涓彲浠ユ寔鏈変換浣曠被鍨嬬殑瀵硅薄錛屾墍浠ヤ嬌鐢═hreadLocal get褰撳墠綰跨▼鐨勫兼槸闇瑕佽繘琛屽己鍒剁被鍨嬭漿鎹€備絾闅忕潃鏂扮殑Java鐗堟湰錛?.5錛夊皢妯$増鐨勫紩鍏ワ紝鏂扮殑鏀寔妯$増鍙傛暟鐨凾hreadLocal<T>綾誨皢浠庝腑鍙楃泭銆備篃鍙互鍑忓皯寮哄埗綾誨瀷杞崲錛屽茍灝嗕竴浜涢敊璇鏌ユ彁鍓嶅埌浜嗙紪璇戞湡錛屽皢涓瀹氱▼搴﹀湴綆鍖朤hreadLocal鐨勪嬌鐢ㄣ?/p> 銆銆鎬葷粨 銆銆褰撶劧ThreadLocal騫朵笉鑳芥浛浠e悓姝ユ満鍒訛紝涓よ呴潰鍚戠殑闂棰嗗煙涓嶅悓銆傚悓姝ユ満鍒舵槸涓轟簡鍚屾澶氫釜綰跨▼瀵圭浉鍚岃祫婧愮殑騫跺彂璁塊棶錛屾槸涓轟簡澶氫釜綰跨▼涔嬮棿榪涜閫氫俊鐨勬湁鏁堟柟寮忥紱鑰孴hreadLocal鏄殧紱誨涓嚎紼嬬殑鏁版嵁鍏變韓錛屼粠鏍規(guī)湰涓婂氨涓嶅湪澶氫釜綰跨▼涔嬮棿鍏變韓璧勬簮錛堝彉閲忥級錛岃繖鏍峰綋鐒朵笉闇瑕佸澶氫釜綰跨▼榪涜鍚屾浜嗐傛墍浠ワ紝濡傛灉浣犻渶瑕佽繘琛屽涓嚎紼嬩箣闂磋繘琛岄氫俊錛屽垯浣跨敤鍚屾鏈哄埗錛涘鏋滈渶瑕侀殧紱誨涓嚎紼嬩箣闂寸殑鍏變韓鍐茬獊錛屽彲浠ヤ嬌鐢═hreadLocal錛岃繖灝嗘瀬澶у湴綆鍖栦綘鐨勭▼搴忥紝浣跨▼搴忔洿鍔犳槗璇匯佺畝媧併?/p> |