文章詳情頁(yè)
在Java1.5中創(chuàng)建可變參數(shù)[Varargs]
瀏覽:11日期:2024-06-15 11:19:01
內(nèi)容: 在Java1.5中創(chuàng)建可變參數(shù) Varargs 作者:Brett;David;譯者:lenovozhf版權(quán)聲明:本文可以自由轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明作者:lenovozhf(作者的Blog:http://blog.matrix.org.cn/page/lenovozhf)原文:http://www.matrix.org.cn/resource/article/44/44065_Java+Varargs.html關(guān)鍵字:Java Varargs編者: O'Reilly的新的開發(fā)者參考書系列關(guān)注于使用的學(xué)問。你可以直接從大師那里得到你需要學(xué)習(xí)的東西,這些東西是以一種非正式的,代碼很精煉的形式展現(xiàn)給軟件開發(fā)人員。由Java暢銷書作者 Brett McLaughlin 和 David Flanagan撰寫的《Java1.5 Tiger:開發(fā)者參考書》正是遵循了相同的模式,把你準(zhǔn)確的領(lǐng)入Tiger的世界。這本書涵蓋了Java1.5重要的新特征,包括:泛型、封箱、拆箱、可變參數(shù)和其他特性。在下面摘錄的書中第五章中, Brett 和 David 講述了如何創(chuàng)建和重復(fù)可變長(zhǎng)度參數(shù)列表(常有稱作可變參數(shù)),這個(gè)特性可以使你迅速寫出更好、更整潔、更靈活的代碼。我們以一個(gè)PDF下載的形式列出了這本書的摘錄。這個(gè)文件的大小略高于190KB。下載第五章“可變參數(shù)。Brett McLaughlin 自從標(biāo)識(shí)語言誕生起,就開始在計(jì)算機(jī)領(lǐng)域工作。(記得那個(gè)小三角嗎?)他目前在用Java和與Java相關(guān)的技術(shù)專攻于建筑應(yīng)用框架領(lǐng)域。David Flanagan是一些 O'Reilly書籍的作者,這些書籍包括:JAVA技術(shù)手冊(cè) 、JAVA實(shí)例技術(shù)手冊(cè)、JFC技術(shù)手冊(cè)、JAVASCRIPT 權(quán)威指南和JAVASCRIPT 參考手冊(cè)。第五章“可變參數(shù)方法重載是Java和其他面向?qū)ο笳Z言最具特色的特性之一。當(dāng)許多人可能認(rèn)為Java的優(yōu)勢(shì)是它的類型,或者是它所帶的API庫(kù),其實(shí)讓相同的方法名與各種各樣可接受的參數(shù)搭配也是一件很好的事。Guitar guitar = new Guitar('Bourgeois', 'Country Boy Deluxe',GuitarWood.MAHOGANY, GuitarWood.ADIRONDACK,1.718);Guitar guitar = new Guitar('Martin', 'HD-28');Guitar guitar = new Guitar('Collings', 'CW-28'GuitarWood.BRAZILIAN_ROSEWOOD, GuitarWood.ADIRONDACK,1.718,GuitarInlay.NO_INLAY, GuitarInlay.NO_INLAY);This code calls three versions of the constructor of a (fictional) Guitar class, meaning that information can be supplied when it’s available,rather than forcing a user to know everything about their guitar at one time (many professionals couldn’t tell you their guitar’s width at the nut).Here are the constructors used:public Guitar(String builder, String model) {}public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth) {}public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,GuitarInlay fretboardInlay, GuitarInlay topInlay) {}這段代碼調(diào)用了Guitar類中三個(gè)版本的構(gòu)造器,意味著當(dāng)信息可見時(shí),這些信息會(huì)被支持,而不是迫使每一個(gè)使用者每一次都要去了解關(guān)于Guitar類的所有知識(shí)。許多專家不會(huì)在關(guān)鍵時(shí)候告訴你他們的Guitar的內(nèi)容。下面是用到的構(gòu)造器:public Guitar(String builder, String model) {}public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth) {}public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,GuitarInlay fretboardInlay, GuitarInlay topInlay) {}然而,當(dāng)你想要去增加無限的信息時(shí),事情開始變得有一點(diǎn)不是那么有用了。例如:假設(shè)你想允許在這個(gè)構(gòu)造器中增加額外的未指明的特性。下面就是一些可能的調(diào)用的例子:Guitar guitar = new Guitar('Collings', 'CW-28'GuitarWood.BRAZILIAN_ROSEWOOD, GuitarWood.ADIRONDACK,1.718,GuitarInlay.NO_INLAY, GuitarInlay.NO_INLAY,'Enlarged Soundhole', 'No Popsicle Brace');Guitar guitar = new Guitar('Martin', 'HD-28V','Hot-rodded by Dan Lashbrook', 'Fossil Ivory Nut','Fossil Ivory Saddle', 'Low-profile bridge pins');對(duì)于這兩個(gè)單獨(dú)的情況,你不得不去增加一個(gè)構(gòu)造器來接受兩個(gè)額外的字符串,另外一個(gè)構(gòu)造器來接受四個(gè)額外的字符串。試圖將這些相似的版本應(yīng)用于早已重載的構(gòu)造器。根據(jù)這樣的話,你最終會(huì)得到20或30個(gè)那樣愚蠢的構(gòu)造器的版本!原因在于我們常稱做的可變參數(shù)。可變參數(shù)是Tiger的增加的另一個(gè)特性,它用一種相當(dāng)巧妙的方法徹底地解決了這兒提出的問題。這一章講述了這種相對(duì)簡(jiǎn)單的特性的各個(gè)方面。這將會(huì)使你迅速寫出更好、更整潔、更靈活的代碼。創(chuàng)建一個(gè)可變長(zhǎng)度的參數(shù)列表可變參數(shù)使得你可以指定某方法來接受多個(gè)同一類型的參數(shù),而且并不要求事先確定參數(shù)的數(shù)量(在編譯或運(yùn)行時(shí))。這就是Tiger的一個(gè)集成部分。事實(shí)上,正是因?yàn)镴ava語言的一些新特性組合在一起才表現(xiàn)出了可變參數(shù)的特性。我如何去實(shí)現(xiàn)呢?首先,你要習(xí)慣的書寫省略號(hào)(。。。)。這三個(gè)小點(diǎn)是可變參數(shù)的關(guān)鍵,你將會(huì)經(jīng)常鍵入它們。下面是Guitar類的構(gòu)造器使用可變參數(shù)來接受不確定數(shù)量字符串的一個(gè)例子:public Guitar(String builder, String model, String...features);參數(shù)String... features 表明任何數(shù)量的字符串都可能被接受。 所以,下面所有的調(diào)用都合法的。Guitar guitar = new Guitar('Martin', 'HD-28V','Hot-rodded by Dan Lashbrook', 'Fossil Ivory Nut','Fossil Ivory Saddle', 'Low-profile bridge pins');Guitar guitar = new Guitar('Bourgeois', 'OMC','Incredible flamed maple bindings on this one.');Guitar guitar = new Guitar('Collings', 'OM-42','Once owned by Steve Kaufman--one of a kind');You could add the same variable-length argument to the other constructors:public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth, String... features)public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,GuitarInlay fretboardInlay,GuitarInlay topInlay,String... features)例5-1描寫了一個(gè)把所有的這些特性放在一起的簡(jiǎn)單類,甚至使用XX來一起傳遞一些可變參數(shù)。Example 5-1. Using varargs in constructorspackage com.oreilly.tiger.ch05;public class Guitar {private String builder;private String model;private float nutWidth;private GuitarWood backSidesWood;private GuitarWood topWood;private GuitarInlay fretboardInlay;private GuitarInlay topInlay;private static final float DEFAULT_NUT_WIDTH = 1.6875f;public Guitar(String builder, String model, String... features) {this(builder, model, null, null, DEFAULT_NUT_WIDTH, null, null, features);}public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth, String... features) {this(builder, model, backSidesWood, topWood, nutWidth, null, null, features);}public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,GuitarInlay fretboardInlay, GuitarInlay topInlay,String... features) {this.builder = builder;this.model = model;this.backSidesWood = backSidesWood;this.topWood = topWood;this.nutWidth = nutWidth;this.fretboardInlay = fretboardInlay;this.topInlay = topInlay;}}剛才發(fā)生了什么?當(dāng)你指定了一個(gè)可變長(zhǎng)度參數(shù)列表,Java編譯器實(shí)際上讀入 “create an array of type 。你鍵入:public Guitar(String builder, String model, String... features)然而:編譯器解釋這些為:public Guitar(String builder, String model, String[] features)這意味著重復(fù)參數(shù)列表變得簡(jiǎn)單(這將在“重復(fù)可變長(zhǎng)度參數(shù)列表里講述),這與你需要完成的其他程序設(shè)計(jì)目標(biāo)是一樣。你可以像使用數(shù)組一樣來使用可變參數(shù)。然而,這同樣存在一些限制。第一,在每個(gè)方法中,你只可以使用一次省略號(hào)。所以,下面的書寫是不合法的:public Guitar(String builder, String model,String... features, float... stringHeights)另外,省略號(hào)必須作為方法的最后一個(gè)參數(shù)。如果你不需要傳遞任何可變參數(shù)呢?那沒關(guān)系,你只需要以舊的方式調(diào)用構(gòu)造器:Guitar guitar = new Guitar('Martin', 'D-18');我們?cè)僮屑?xì)看看,雖然程序中沒有與下面代碼相匹配的構(gòu)造器:public Guitar(String builder, String model)那么,代碼到底傳遞了什么呢?作為可變參數(shù)的特例,在參數(shù)中不傳遞東西是一個(gè)合法的選項(xiàng)。所以,當(dāng)你看到 String... features,你應(yīng)該把它認(rèn)為是零個(gè)或者更多個(gè)String參數(shù)。這省卻你再去創(chuàng)建另一個(gè)不帶可變參數(shù)構(gòu)造器的麻煩。重復(fù)可變長(zhǎng)度參數(shù)類表所有這些可變參數(shù)是很好的。但是實(shí)際上,如果你不在你的方法中使用它們的話,他們顯然僅僅是吸引眼球的東西或是窗戶的裝飾品而已。然而,你可以像你使用數(shù)組一樣來使用可變參數(shù),你會(huì)覺得這種用法很簡(jiǎn)單。那我怎么來使用可變參數(shù)呢?首先你要確保閱讀了“創(chuàng)建一個(gè)可變長(zhǎng)度的參數(shù)列表,你會(huì)從中了解到可變參數(shù)方法最重要的東西,那就是我們把可變參數(shù)當(dāng)作數(shù)組來看待。所以,繼續(xù)前面的例子,你可以寫出下面的代碼:public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,GuitarInlay fretboardInlay, GuitarInlay topInlay,String... features) {this.builder = builder;this.model = model;this.backSidesWood = backSidesWood;this.topWood = topWood;this.nutWidth = nutWidth;this.fretboardInlay = fretboardInlay;this.topInlay = topInlay;for (String feature : features) {System.out.println(feature);}}上面的這段代碼看上是不是不是那么的有吸引力?但這確實(shí)體現(xiàn)了可變參數(shù)的精髓。作為另一個(gè)例子,下面這個(gè)簡(jiǎn)單的方法從一組數(shù)字中計(jì)算出最大值:public static int max(int first, int... rest) {int max = first;for (int i : rest) {if (i> max)max = i;}return max;}是不是,夠簡(jiǎn)單吧?那么如何存儲(chǔ)可變長(zhǎng)度參數(shù)呢?正因?yàn)镴ava編譯器把這些看作數(shù)組,所以數(shù)組顯然是一個(gè)存儲(chǔ)的好選擇,這將在下面的例5-2中體現(xiàn)。Example 5-2. 存儲(chǔ)作為成員變量的可變參數(shù)package com.oreilly.tiger.ch05;public class Guitar {private String builder;private String model;private float nutWidth;private GuitarWood backSidesWood;private GuitarWood topWood;private GuitarInlay fretboardInlay;private GuitarInlay topInlay;private String[] features;private static final float DEFAULT_NUT_WIDTH = 1.6875f;public Guitar(String builder, String model, String... features) {this(builder, model, null, null, DEFAULT_NUT_WIDTH, null, null, features);}public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth, String... features) {this(builder, model, backSidesWood, topWood, nutWidth, null, null, features);}public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,GuitarInlay fretboardInlay, GuitarInlay topInlay,String... features) {this.builder = builder;this.model = model;this.backSidesWood = backSidesWood;this.topWood = topWood;this.nutWidth = nutWidth;this.fretboardInlay = fretboardInlay;this.topInlay = topInlay;this.features = features;}}你可以簡(jiǎn)單地在Java的Collection類中存儲(chǔ)這些可變參數(shù)。//變量聲明private List features;//在方法中或是構(gòu)造器中的書寫this.features = java.util.Arrays.asList(features);允許零長(zhǎng)度的參數(shù)列表可變參數(shù)的一個(gè)顯著的特性是可變長(zhǎng)度參數(shù)可以接受零到N個(gè)參數(shù)。這就意味著你可以調(diào)用這些方法中的一個(gè)方法而不傳遞任何參數(shù),程序同樣可以運(yùn)行。從另一方面來說,這又意味著,作為一個(gè)程序員,你最好意識(shí)到你必須防范這種情況的發(fā)生。如何實(shí)現(xiàn)它呢?記得在“重復(fù)可變長(zhǎng)度參數(shù)類表中,你讀到過下面這個(gè)簡(jiǎn)單的方法:public static int max(int first, int... rest) {int max = first;for (int i : rest) {if (i> max)max = i;}return max;}你可以以多種形式來調(diào)用這個(gè)方法:int max = MathUtils.max(1, 4);int max = MathUtils.max(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);int max = MathUtils.max(18, 8, 4, 2, 1, 0);有一點(diǎn)不是那么令人滿意的地方是,在很多情況下,你要傳遞的數(shù)字已經(jīng)存儲(chǔ)在數(shù)組里,或是至少是在某些集成的形式中://用這種方法來取得數(shù)字int[] numbers = getListOfNumbers( );要把這些數(shù)字傳遞給max()方法是不可能的。你需要檢查list的長(zhǎng)度,從中截取掉第一個(gè)對(duì)象(如果存在第一個(gè)對(duì)象的話),然后檢查類型來確保是int型。完成了這些,你才可以帶著數(shù)組中剩余的部分一起傳遞進(jìn)入方法。而這數(shù)組中剩余的部分還要重復(fù),或者要人工地轉(zhuǎn)化為適合的格式。總之,這個(gè)過程會(huì)很辛苦,你需要做許多瑣碎的事情。仔細(xì)想想,你要記得編譯器是將這個(gè)方法解釋為下面的語句:public static int max(int first, int[] rest)所以,你可以做些調(diào)整,把max()方法改寫成下面這個(gè)樣子:public static int max(int... values) {int max = Integer.MIN_VALUE;for (int i : values) {if (i> max)max = i;}return你現(xiàn)在已經(jīng)定義了一個(gè)可以很容易接受數(shù)組的方法。//用這種方法來取得數(shù)字int[] numbers = getListOfNumbers( );int max = MathUtils.max(numbers);當(dāng)接受單一的可變長(zhǎng)度參數(shù)時(shí),你使用這種方法會(huì)很簡(jiǎn)單。但是,如果在最好的情況下,你傳遞了一個(gè)零長(zhǎng)度的數(shù)組進(jìn)去,這就會(huì)帶來問題,你會(huì)得到難以預(yù)料的結(jié)果。為了解決這個(gè)問題,你需要一個(gè)小的錯(cuò)誤檢查。例5-3是MathUtils類的完整代碼列表,在這里是一個(gè)功能更強(qiáng)的MathUtil類。例5-3 處理零參數(shù)的方法package com.oreilly.tiger.ch05;public class MathUtils {public static int max(int... values) {if (values.length == 0) {throw new IllegalArgumentException('No values supplied.');}任何時(shí)候,你都可能會(huì)要處理零長(zhǎng)度的參數(shù)列表,這時(shí)你就需要執(zhí)行這類的錯(cuò)誤檢查。通常,一個(gè)功能強(qiáng)大的IllegalArgumentException類是一個(gè)好的選擇。int max = Integer.MIN_VALUE;for (int i : values) {if (i> max)max = i;}return max;}}那么關(guān)于調(diào)用同樣的方法來處理通常參數(shù)不是數(shù)組的方法,又會(huì)如何呢?這當(dāng)然是完全合法的。下面的代碼都是合法調(diào)用max()方法的手段:int max = MathUtils.max(myArray);int max = MathUtils.max(new int[] { 2, 4, 6, 8 });int max = MathUtils.max(2, 4, 6, 8);int max = MathUtils.max(0);int max = MathUtils.max( );指定對(duì)象參數(shù),而非基本類型在第四章中我們談到,Tiger通過拆箱增加了一系列的新特征。你可以在處理可變參數(shù)時(shí),在你的方法接受的參數(shù)中使用對(duì)象包裝類。如何實(shí)現(xiàn)?你一定記得在Java中所有的類最終都是java.lang.Object的子類。這就意味著任何對(duì)象可以被轉(zhuǎn)化成一個(gè)Object對(duì)象。更進(jìn)一步說,因?yàn)橄駃nt和short這樣的基本類型會(huì)自動(dòng)轉(zhuǎn)化成他們對(duì)應(yīng)的對(duì)象包裝類(就像Integer和Short),任何Java類型可以被轉(zhuǎn)化成一個(gè)Object對(duì)象。所以,如果你需要你的可變參數(shù)方法可以接受最多種參數(shù)的類型,那么你可以將Object類型作為參數(shù)的類型。更好的是,為了達(dá)到多重功能,絕大多數(shù)情況下都會(huì)使用Object對(duì)象。例如,寫個(gè)用來打印方法。private String print(Object... values) {StringBuilder sb = new StringBuilder( );for (Object o : values) {sb.append(o).append(' ');}return sb.toString( );}這兒最簡(jiǎn)單的意思是打印出所有的東西。然而,這個(gè)方法更通用的定義是下面的樣子:private String print(String... values) {StringBuilder sb = new StringBuilder( );for (Object o : values) {sb.append(o).append(' ');}return sb.toString( );}這個(gè)方法的問題是方法自身不能接受字符串,整數(shù),浮點(diǎn)數(shù),數(shù)組和其他的類型數(shù)據(jù),而這些數(shù)據(jù)你都想要正常的打印出來。通過使用Object這個(gè)更為通用的類型,你可以來打印所有的一切。private String print(Object... values) {StringBuilder sb = new StringBuilder( );for (Object o : values) {sb.append(o).append(' ');}return sb.toString( );}避免數(shù)組自動(dòng)轉(zhuǎn)化Tiger增加了各種類型的自動(dòng)轉(zhuǎn)化和便利,這些東西在絕大多數(shù)的情況下是很好用的。不幸的是,有些時(shí)候所有的這些東西會(huì)變成你的障礙。其中一種情況是,在可變參數(shù)方法中將多個(gè)Object對(duì)象轉(zhuǎn)化為Object[]數(shù)組對(duì)象,你會(huì)發(fā)現(xiàn)在個(gè)別的情況下,你需要用Java來書寫。如何實(shí)現(xiàn)?在將要仔細(xì)討論這件事情前,你要確信自己理解這個(gè)問題。Java新的printf()方法是一個(gè)很好的便利,舉這個(gè)方法作個(gè)例子:System.out.printf('The balance of %s's account is $%(,6.2fn',account.getOwner().getFullName( ),account.getBalance( ));如果你看一下Java文檔中關(guān)于printf()方法的說明,你就會(huì)看到它是一個(gè)可變參數(shù)的方法。它有兩個(gè)參數(shù):一個(gè)是用于設(shè)置字符串格式的String類型變量,另一個(gè)是所有要傳遞進(jìn)字符串的Object對(duì)象:PrintStream printf(String format, Object... args)現(xiàn)在,你可以把上面的代碼默認(rèn)為下面的形式:PrintStream printf(String format, Object[] args)兩種書寫是不是完全相同呢?大多數(shù)情況下是相同的。考慮一下下面的代碼:Object[] objectArray = getObjectArrayFromSomewhereElse( );out.printf('Description of object array: %sn', obj);這是乎有點(diǎn)牽強(qiáng),然而要把它看作是為了自省的代碼而付出的正常開銷。比起其它代碼,這樣寫要簡(jiǎn)潔的多。如果你正在編寫一個(gè)代碼分析工具,或者一個(gè)集成開發(fā)環(huán)境,或者其他可能使用reflection或簡(jiǎn)單API來判斷出應(yīng)用程序會(huì)需要何種對(duì)象的東西,這些馬上會(huì)成為一個(gè)通用的案例。這兒,你不是真正關(guān)心對(duì)象數(shù)組的內(nèi)容,就像你同樣不會(huì)去關(guān)心數(shù)組自身一樣。它是什么類型?它的內(nèi)存地址是多少?它的字符串代表什么意思?請(qǐng)緊記所有這些問題都是和數(shù)組本身有關(guān)的,和數(shù)組的內(nèi)容無關(guān)。例如:我們來看看下面的數(shù)組代碼:public Object[] getObjectArrayFromSomewhereElse( ) {return new String[] {'Hello', 'to', 'all', 'of', 'you'};}在這種情況下,你肯能會(huì)寫一些像下面一樣的代碼來回答某些關(guān)于數(shù)組的問題:out.printf('Description of object array: %sn', obj);然而,輸出結(jié)果并不是你所期望的那樣:run-ch05:[echo] Running Chapter 5 examples from Java Tiger: A Developer's Notebook[echo] Running VarargsTester...[java] Hello這倒是怎么回事?這就不是你想看到的結(jié)果。然而,編譯器做了它應(yīng)該做的,它把在printf()方法里的Object...轉(zhuǎn)換為Object[]。實(shí)際上,當(dāng)編譯器得到你方法的調(diào)用時(shí),它看到的參數(shù)是Object[]。所以編譯器不是把這個(gè)數(shù)組看作一個(gè)Object對(duì)象本身,而是把它分成不同的部分。這樣被傳遞給字符串格式 (%s)的就是第一個(gè)參數(shù)部分“Hello字符串,所以結(jié)果“Hello就顯示出來了。仔細(xì)看看這件事,你需要去告訴編譯器你要把整個(gè)對(duì)象數(shù)組obj看作是一個(gè)簡(jiǎn)單的對(duì)象,而不是一組參數(shù)。請(qǐng)看下面奇特的代碼:out.printf('Description of object array: %sn', new Object[] { obj });作為選擇,還有一種更為簡(jiǎn)單的方法:out.printf('Description of object array: %sn', (Object)obj);在上面兩種書寫情況下,編譯器不再認(rèn)為是對(duì)象的數(shù)組,而是直接認(rèn)為是一個(gè)簡(jiǎn)單的Object對(duì)象,而這個(gè)Object對(duì)象又恰好是一個(gè)對(duì)象數(shù)組。那么結(jié)果就如你所愿(至少在這種簡(jiǎn)單的應(yīng)用下):run-ch05:[echo] Running Chapter 5 examples from Java Tiger: A Developer's Notebook[echo] Running VarargsTester...[java] [Ljava.lang.String;@c44b88看到結(jié)果,你肯能會(huì)感到有點(diǎn)錯(cuò)亂。這大概是基于reflection或者其他自省代碼需要的結(jié)果。全章完. Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd 在Java1.5中創(chuàng)建可變參數(shù) Varargs 作者:Brett;David;譯者:lenovozhf版權(quán)聲明:本文可以自由轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處?
標(biāo)簽:
Java
相關(guān)文章:
1. css進(jìn)階學(xué)習(xí) 選擇符2. html清除浮動(dòng)的6種方法示例3. ASP中解決“對(duì)象關(guān)閉時(shí),不允許操作。”的詭異問題……4. ASP基礎(chǔ)知識(shí)Command對(duì)象講解5. ASP.NET Core按用戶等級(jí)授權(quán)的方法6. HTML <!DOCTYPE> 標(biāo)簽7. XML入門精解之結(jié)構(gòu)與語法8. asp知識(shí)整理筆記4(問答模式)9. 淺談SpringMVC jsp前臺(tái)獲取參數(shù)的方式 EL表達(dá)式10. .NET6打包部署到Windows Service的全過程
排行榜
