ºìÁªLinuxÃÅ»§
Linux°ïÖú

Àí½âjavaµÄ¶àÐÎÐÔ

·¢²¼Ê±¼ä:2006-11-03 00:46:14À´Ô´:ºìÁª×÷Õß:coolentboy
¡°¶ÔÓÚÃæÏò¶ÔÏóµÄ³ÌÐòÉè¼ÆÓïÑÔ£¬¶àÐÍÐÔÊǵÚÈýÖÖ×î»ù±¾µÄÌØÕ÷£¨Ç°Á½ÖÖÊÇÊý¾Ý³éÏóºÍ¼Ì³Ð¡£¡±

¡°¶àÐÎÐÔ¡±£¨Polymorphism£©´ÓÁíÒ»¸ö½Ç¶È½«½Ó¿Ú´Ó¾ßÌåµÄʵʩϸ½ÚÖзÖÀë³öÀ´£¬Ò༴ʵÏÖÁË¡°ÊÇʲô¡±Óë¡°ÔõÑù×ö¡±Á½¸öÄ£¿éµÄ·ÖÀë¡£ÀûÓöàÐÎÐԵĸÅÄ´úÂëµÄ×éÖ¯ÒÔ¼°¿É¶ÁÐÔ¾ùÄÜ»ñµÃ¸ÄÉÆ¡£´ËÍ⣬»¹ÄÜ´´½¨¡°Ò×ÓÚÀ©Õ¹¡±µÄ³ÌÐò¡£ÎÞÂÛÔÚÏîÄ¿µÄ´´½¨¹ý³ÌÖУ¬»¹ÊÇÔÚÐèÒª¼ÓÈëÐÂÌØÐÔµÄʱºò£¬ËüÃǶ¼¿ÉÒÔ·½±ãµØ¡°³É³¤¡±¡£
ͨ¹ýºÏ²¢¸÷ÖÖÌØÕ÷ÓëÐÐΪ£¬·â×°¼¼Êõ¿É´´½¨³öеÄÊý¾ÝÀàÐÍ¡£Í¨¹ý¶Ô¾ßÌåʵʩϸ½ÚµÄÒþ²Ø£¬¿É½«½Ó¿ÚÓëʵʩϸ½Ú·ÖÀ룬ʹËùÓÐϸ½Ú³ÉΪ¡°private¡±£¨Ë½ÓУ©¡£ÕâÖÖ×éÖ¯·½Ê½Ê¹ÄÇЩÓгÌÐò»¯±à³Ì±³¾°È˸оõÆÄΪÊæÊÊ¡£µ«¶àÐÎÐÔÈ´Éæ¼°¶Ô¡°ÀàÐÍ¡±µÄ·Ö½â¡£Í¨¹ýÉÏÒ»ÕµÄѧϰ£¬´ó¼ÒÒÑÖªµÀͨ¹ý¼Ì³Ð¿É½«Ò»¸ö¶ÔÏóµ±×÷Ëü×Ô¼ºµÄÀàÐÍ»òÕßËü×Ô¼ºµÄ»ù´¡ÀàÐͶԴý¡£ÕâÖÖÄÜÁ¦ÊÇÊ®·ÖÖØÒªµÄ£¬ÒòΪ¶à¸öÀàÐÍ£¨´ÓÏàͬµÄ»ù´¡ÀàÐÍÖÐÑÜÉú³öÀ´£©¿É±»µ±×÷ͬһÖÖÀàÐͶԴý¡£¶øÇÒÖ»ÐèÒ»¶Î´úÂ룬¼´¿É¶ÔËùÓв»Í¬µÄÀàÐͽøÐÐͬÑùµÄ´¦Àí¡£ÀûÓþßÓжàÐÎÐԵķ½·¨µ÷Óã¬Ò»ÖÖÀàÐͿɽ«×Ô¼ºÓëÁíÒ»ÖÖÏàËƵÄÀàÐÍÇø·Ö¿ª£¬Ö»ÒªËüÃǶ¼ÊÇ´ÓÏàͬµÄ»ù´¡ÀàÐÍÖÐÑÜÉú³öÀ´µÄ¡£ÕâÖÖÇø·ÖÊÇͨ¹ý¸÷ÖÖ·½·¨ÔÚÐÐΪÉϵIJîÒìʵÏֵģ¬¿Éͨ¹ý»ù´¡ÀàʵÏÖ¶ÔÄÇЩ·½·¨µÄµ÷Óá£
ÔÚÕâÒ»ÕÂÖУ¬´ó¼ÒÒªÓÉdzÈëÉîµØѧϰÓйضàÐÎÐÔµÄÎÊÌ⣨Ҳ½Ð×÷¶¯Ì¬°ó¶¨¡¢ÍƳٰ󶨻òÕßÔËÐÐÆڰ󶨣©¡£Í¬Ê±¾ÙһЩ¼òµ¥µÄÀý×Ó£¬ÆäÖÐËùÓÐÎ޹صIJ¿·Ö¶¼ÒÑ°þ³ý£¬Ö»±£ÁôÓë¶àÐÎÐÔÓйصĴúÂë¡£

7.1 ÉÏËÝÔìÐÍ
ÔÚµÚ6Õ£¬´ó¼ÒÒÑÖªµÀ¿É½«Ò»¸ö¶ÔÏó×÷ΪËü×Ô¼ºµÄÀàÐÍʹÓ㬻òÕß×÷ΪËüµÄ»ù´¡ÀàÐ͵ÄÒ»¸ö¶ÔÏóʹÓá£È¡µÃÒ»¸ö¶ÔÏó¾ä±ú£¬²¢½«Æä×÷Ϊ»ù´¡ÀàÐ;ä±úʹÓõÄÐÐΪ¾Í½Ð×÷¡°ÉÏËÝÔìÐÍ¡±----ÒòΪ¼Ì³ÐÊ÷µÄ»­·¨ÊÇ»ù´¡ÀàλÓÚ×îÉÏ·½¡£
µ«ÕâÑù×öÒ²»áÓöµ½Ò»¸öÎÊÌ⣬ÈçÏÂÀýËùʾ£¨ÈôÖ´ÐÐÕâ¸ö³ÌÐòÓöµ½Âé·³£¬Çë²Î¿¼µÚ3ÕµÄ3.1.2С½Ú¡°¸³Öµ¡±£©£º


//: Music.java
// Inheritance & upcasting
package c07;

class Note {
private int value;
private Note(int val) { value = val; }
public static final Note
middleC = new Note(0),
cSharp = new Note(1),
cFlat = new Note(2);
} // Etc.

class Instrument {
public void play(Note n) {
System.out.println("Instrument.play()");
}
}

// Wind objects are instruments
// because they have the same interface:
class Wind extends Instrument {
// Redefine interface method:
public void play(Note n) {
System.out.println("Wind.play()");
}
}

public class Music {
public static void tune(Instrument i) {
// ...
i.play(Note.middleC);
}
public static void main(String[] args) {
Wind flute = new Wind();
tune(flute); // Upcasting
}
} ///:~

ÆäÖУ¬·½·¨Music.tune()½ÓÊÕÒ»¸öInstrument¾ä±ú£¬Í¬Ê±Ò²½ÓÊÕ´ÓInstrumentÑÜÉú³öÀ´µÄËùÓж«Î÷¡£µ±Ò»¸öWind¾ä±ú´«µÝ¸øtune()µÄʱºò£¬¾Í»á³öÏÖÕâÖÖÇé¿ö¡£´ËʱûÓÐÔìÐ͵ıØÒª¡£ÕâÑù×öÊÇ¿ÉÒÔ½ÓÊܵģ»InstrumentÀïµÄ½Ó¿Ú±ØÐë´æÔÚÓÚWindÖУ¬ÒòΪWindÊÇ´ÓInstrumentÀï¼Ì³ÐµÃµ½µÄ¡£´ÓWindÏòInstrumentµÄÉÏËÝÔìÐÍ¿ÉÄÜ¡°ËõС¡±ÄǸö½Ó¿Ú£¬µ«²»¿ÉÄÜ°ÑËü±äµÃ±ÈInstrumentµÄÍêÕû½Ó¿Ú»¹ÒªÐ¡¡£

7.1.1 ΪʲôҪÉÏËÝÔìÐÍ
Õâ¸ö³ÌÐò¿´ÆðÀ´Ò²ÐíÏÔµÃÓÐЩÆæ¹Ö¡£ÎªÊ²Ã´ËùÓÐÈ˶¼Ó¦¸ÃÓÐÒâÍü¼ÇÒ»¸ö¶ÔÏóµÄÀàÐÍÄØ£¿½øÐÐÉÏËÝÔìÐÍʱ£¬¾Í¿ÉÄܲúÉúÕâ·½ÃæµÄÒɻ󡣶øÇÒÈç¹ûÈÃtune()¼òµ¥µØÈ¡µÃÒ»¸öWind¾ä±ú£¬½«Æä×÷Ϊ×Ô¼ºµÄ×Ô±äÁ¿Ê¹Óã¬Ëƺõ»á¸ü¼Ó¼òµ¥¡¢Ö±¹ÛµÃ¶à¡£µ«Òª×¢Ò⣺¼ÙÈçÄÇÑù×ö£¬¾ÍÐèΪϵͳÄÚInstrumentµÄÿÖÖÀàÐÍдһ¸öȫеÄtune()¡£¼ÙÉè°´ÕÕÇ°ÃæµÄÍÆÂÛ£¬¼ÓÈëStringed£¨ÏÒÀÖ£©ºÍBrass£¨Í­¹Ü£©ÕâÁ½ÖÖInstrument£¨ÀÖÆ÷£©£º

//: Music2.java
// Overloading instead of upcasting

class Note2 {
private int value;
private Note2(int val) { value = val; }
public static final Note2
middleC = new Note2(0),
cSharp = new Note2(1),
cFlat = new Note2(2);
} // Etc.

class Instrument2 {
public void play(Note2 n) {
System.out.println("Instrument2.play()");
}
}

class Wind2 extends Instrument2 {
public void play(Note2 n) {
System.out.println("Wind2.play()");
}
}

class Stringed2 extends Instrument2 {
public void play(Note2 n) {
System.out.println("Stringed2.play()");
}
}

class Brass2 extends Instrument2 {
public void play(Note2 n) {
System.out.println("Brass2.play()");
}
}

public class Music2 {
public static void tune(Wind2 i) {
i.play(Note2.middleC);
}
public static void tune(Stringed2 i) {
i.play(Note2.middleC);
}
public static void tune(Brass2 i) {
i.play(Note2.middleC);
}
public static void main(String[] args) {
Wind2 flute = new Wind2();
Stringed2 violin = new Stringed2();
Brass2 frenchHorn = new Brass2();
tune(flute); // No upcasting
tune(violin);
tune(frenchHorn);
}
} ///:~

ÕâÑù×öµ±È»ÐеÃͨ£¬µ«È´´æÔÚÒ»¸ö¼«´óµÄ±×¶Ë£º±ØÐëΪÿÖÖÐÂÔöµÄInstrument2Àà±àдÓëÀà½ôÃÜÏà¹ØµÄ·½·¨¡£ÕâÒâζ×ŵÚÒ»´Î¾ÍÒªÇó¶àµÃ¶àµÄ±à³ÌÁ¿¡£ÒԺ󣬼ÙÈçÏëÌí¼ÓÒ»¸öÏótune()ÄÇÑùµÄз½·¨»òÕßΪInstrumentÌí¼ÓÒ»¸öÐÂÀàÐÍ£¬ÈÔÈ»ÐèÒª½øÐдóÁ¿±àÂ빤×÷¡£´ËÍ⣬¼´Ê¹Íü¼Ç¶Ô×Ô¼ºµÄij¸ö·½·¨½øÐйýÔØÉèÖ㬱àÒëÆ÷Ò²²»»áÌáʾÈκδíÎó¡£ÕâÑùÒ»À´£¬ÀàÐ͵ÄÕû¸ö²Ù×÷¹ý³Ì¾ÍÏԵü«ÄѹÜÀí£¬ÓÐʧ¿ØµÄΣÏÕ¡£
µ«¼ÙÈçֻдһ¸ö·½·¨£¬½«»ù´¡Àà×÷Ϊ×Ô±äÁ¿»ò²ÎÊýʹÓ㬶ø²»ÊÇʹÓÃÄÇЩÌض¨µÄÑÜÉúÀ࣬Æñ²»ÊÇ»á¼òµ¥µÃ¶à£¿Ò²¾ÍÊÇ˵£¬Èç¹ûÎÒÃÇÄܲ»¹ËÑÜÉúÀֻ࣬ÈÃ×Ô¼ºµÄ´úÂëÓë»ù´¡Àà´ò½»µÀ£¬ÄÇôʡÏµĹ¤×÷Á¿½«ÊÇÄÑÒÔ¹À¼ÆµÄ¡£
ÕâÕýÊÇ¡°¶àÐÎÐÔ¡±´óÏÔÉíÊֵĵط½¡£È»¶ø£¬´ó¶àÊý³ÌÐòÔ±£¨ÌرðÊÇÓгÌÐò»¯±à³Ì±³¾°µÄ£©¶ÔÓÚ¶àÐÎÐԵŤ×÷Ô­ÀíÈÔÈ»ÏÔµÃÓÐЩÉúÊè¡£

7.2 ÉîÈëÀí½â
¶ÔÓÚMusic.javaµÄÀ§ÄÑÐÔ£¬¿Éͨ¹ýÔËÐгÌÐò¼ÓÒÔÌå»á¡£Êä³öÊÇWind.play()¡£Õ⵱ȻÊÇÎÒÃÇÏ£ÍûµÄÊä³ö£¬µ«Ëü¿´ÆðÀ´Ëƺõ²¢²»Ô¸°´ÎÒÃǵÄÏ£ÍûÐÐÊ¡£Çë¹Û²ìÒ»ÏÂtune()·½·¨£º

public static void tune(Instrument i) {
// ...
i.play(Note.middleC);
}

Ëü½ÓÊÕInstrument¾ä±ú¡£ËùÒÔÔÚÕâÖÖÇé¿öÏ£¬±àÒëÆ÷ÔõÑù²ÅÄÜÖªµÀInstrument¾ä±úÖ¸ÏòµÄÊÇÒ»¸öWind£¬¶ø²»ÊÇÒ»¸öBrass»òStringedÄØ£¿±àÒëÆ÷ÎÞ´ÓµÃÖª¡£ÎªÁËÉîÈëÁËÀí½âÕâ¸öÎÊÌ⣬ÎÒÃÇÓбØҪ̽ÌÖһϡ°°ó¶¨¡±Õâ¸öÖ÷Ìâ¡£

7.2.1 ·½·¨µ÷Óõİó¶¨
½«Ò»¸ö·½·¨µ÷ÓÃͬһ¸ö·½·¨Ö÷ÌåÁ¬½Óµ½Ò»Æð¾Í³ÆΪ¡°°ó¶¨¡±£¨Binding£©¡£ÈôÔÚ³ÌÐòÔËÐÐÒÔÇ°Ö´Ðа󶨣¨ÓɱàÒëÆ÷ºÍÁ´½Ó³ÌÐò£¬Èç¹ûÓеĻ°£©£¬¾Í½Ð×÷¡°ÔçÆڰ󶨡±¡£´ó¼ÒÒÔÇ°»òÐí´ÓδÌý˵¹ýÕâ¸öÊõÓÒòΪËüÔÚÈκγÌÐò»¯ÓïÑÔÀﶼÊDz»¿ÉÄܵġ£C±àÒëÆ÷Ö»ÓÐÒ»ÖÖ·½·¨µ÷Óã¬ÄǾÍÊÇ¡°ÔçÆڰ󶨡±¡£
ÉÏÊö³ÌÐò×îÁîÈËÃÔ»ó²»½âµÄµØ·½È«ÓëÔçÆÚ°ó¶¨Óйأ¬ÒòΪÔÚÖ»ÓÐÒ»¸öInstrument¾ä±úµÄÇ°ÌáÏ£¬±àÒëÆ÷²»ÖªµÀ¾ßÌå¸Ãµ÷ÓÃÄĸö·½·¨¡£
½â¾öµÄ·½·¨¾ÍÊÇ¡°ºóÆڰ󶨡±£¬ËüÒâζ×Å°ó¶¨ÔÚÔËÐÐÆÚ¼ä½øÐУ¬ÒÔ¶ÔÏóµÄÀàÐÍΪ»ù´¡¡£ºóÆÚ°ó¶¨Ò²½Ð×÷¡°¶¯Ì¬°ó¶¨¡±»ò¡°ÔËÐÐÆڰ󶨡±¡£ÈôÒ»ÖÖÓïÑÔʵÏÖÁ˺óÆڰ󶨣¬Í¬Ê±±ØÐëÌṩһЩ»úÖÆ£¬¿ÉÔÚÔËÐÐÆÚ¼äÅж϶ÔÏóµÄÀàÐÍ£¬²¢·Ö±ðµ÷ÓÃÊʵ±µÄ·½·¨¡£Ò²¾ÍÊÇ˵£¬±àÒëÆ÷´ËʱÒÀÈ»²»ÖªµÀ¶ÔÏóµÄÀàÐÍ£¬µ«·½·¨µ÷ÓûúÖÆÄÜ×Ô¼ºÈ¥µ÷²é£¬ÕÒµ½ÕýÈ·µÄ·½·¨Ö÷Ìå¡£²»Í¬µÄÓïÑÔ¶ÔºóÆڰ󶨵ÄʵÏÖ·½·¨ÊÇÓÐËùÇø±ðµÄ¡£µ«ÎÒÃÇÖÁÉÙ¿ÉÒÔÕâÑùÈÏΪ£ºËüÃǶ¼ÒªÔÚ¶ÔÏóÖа²²åijЩÌØÊâÀàÐ͵ÄÐÅÏ¢¡£
JavaÖа󶨵ÄËùÓз½·¨¶¼²ÉÓúóÆڰ󶨼¼Êõ£¬³ý·ÇÒ»¸ö·½·¨Òѱ»ÉùÃ÷³Éfinal¡£ÕâÒâζ×ÅÎÒÃÇͨ³£²»±Ø¾ö¶¨ÊÇ·ñÓ¦½øÐкóÆÚ°ó¶¨----ËüÊÇ×Ô¶¯·¢ÉúµÄ¡£
ΪʲôҪ°ÑÒ»¸ö·½·¨ÉùÃ÷³ÉfinalÄØ£¿ÕýÈçÉÏÒ»ÕÂÖ¸³öµÄÄÇÑù£¬ËüÄÜ·ÀÖ¹ÆäËûÈ˸²¸ÇÄǸö·½·¨¡£µ«Ò²Ðí¸üÖØÒªµÄÒ»µãÊÇ£¬Ëü¿ÉÓÐЧµØ¡°¹Ø±Õ¡±¶¯Ì¬°ó¶¨£¬»òÕ߸æËß±àÒëÆ÷²»ÐèÒª½øÐж¯Ì¬°ó¶¨¡£ÕâÑùÒ»À´£¬±àÒëÆ÷¾Í¿ÉΪfinal·½·¨µ÷ÓÃÉú³ÉЧÂʸü¸ßµÄ´úÂë¡£

7.2.2 ²úÉúÕýÈ·µÄÐÐΪ
ÖªµÀJavaÀï°ó¶¨µÄËùÓз½·¨¶¼Í¨¹ýºóÆڰ󶨾ßÓжàÐÎÐÔÒԺ󣬾ͿÉÒÔÏàÓ¦µØ±àд×Ô¼ºµÄ´úÂ룬ÁîÆäÓë»ù´¡À๵ͨ¡£´Ëʱ£¬ËùÓеÄÑÜÉúÀ඼±£Ö¤ÄÜÓÃÏàͬµÄ´úÂëÕý³£µØ¹¤×÷¡£»òÕß»»ÓÃÁíÒ»ÖÖ·½·¨£¬ÎÒÃÇ¿ÉÒÔ¡°½«Ò»ÌõÏûÏ¢·¢¸øÒ»¸ö¶ÔÏó£¬ÈöÔÏó×ÔÐÐÅжÏÒª×öʲôÊÂÇé¡£¡±
ÔÚÃæÏò¶ÔÏóµÄ³ÌÐòÉè¼ÆÖУ¬ÓÐÒ»¸ö¾­µäµÄ¡°ÐÎ×´¡±Àý×Ó¡£ÓÉÓÚËüºÜÈÝÒ×ÓÿÉÊÓ»¯µÄÐÎʽ±íÏÖ³öÀ´£¬ËùÒÔ¾­³£¶¼ÓÃËü˵Ã÷ÎÊÌâ¡£µ«ºÜ²»ÐÒµÄÊÇ£¬Ëü¿ÉÄÜÎóµ¼³õѧÕßÈÏΪOOPÖ»ÊÇΪͼÐλ¯±à³ÌÉè¼ÆµÄ£¬ÕâÖÖÈÏʶµ±È»ÊÇ´íÎóµÄ¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ