Professional Documents
Culture Documents
Exam Objectives
:ULWHFRGHWRFRQVWUXFWLQVWDQFHVRIDQ\FRQFUHWHFODVVLQFOXGLQJQRUPDO
WRSOHYHOFODVVHVLQQHUFODVVHVVWDWLFLQQHUFODVVHVDQGDQRQ\PRXVLQQHU
FODVVHV
Supplementary Objectives
6WDWHWKHNLQGVRIQHVWHGFODVVHVDQGLQWHUIDFHVWKDWFDQEHGHILQHG
,GHQWLI\WKHFRQWH[WLQZKLFKDQHVWHGFODVVRULQWHUIDFHFDQEHGHILQHG
6WDWHZKLFKDFFHVVLELOLW\PRGLILHUVDUHDOORZHGIRUHDFKFDWHJRU\RIQHVWHG
FODVVHV
6WDWHZKLFKQHVWHGFODVVHVFUHDWHLQVWDQFHVWKDWDUHDVVRFLDWHGZLWKLQVWDQFHV
RIWKHRXWHUFRQWH[W
6WDWHWKHDFFHVVUXOHVWKDWJRYHUQDFFHVVLQJHQWLWLHVLQWKHRXWHUFRQWH[WRI
QHVWHGFODVVHVDQGZULWHFRGHWKDWXVHVWKHDXJPHQWHGV\QWD[LQYROYLQJWKH
thisNH\ZRUGIRUWKLVSXUSRVH
6WDWHZKHWKHUDGHILQLWLRQRIDQHVWHGFODVVFDQFRQWDLQVWDWLFDQGQRQVWDWLF
PHPEHUV
:ULWHFRGHWRLQVWDQWLDWHQHVWHGFODVVHVXVLQJWKHDXJPHQWHGV\QWD[RIWKH
newRSHUDWRU
:ULWHFRGHWRVKRZKRZQHVWHGFODVVHVFDQEHLPSRUWHGDQGXVHG
'LVWLQJXLVKEHWZHHQWKHLQKHULWDQFHDQGFRQWDLQPHQWKLHUDUFK\RIDQ\
QHVWHGFODVVRULQWHUIDFH
:ULWHFRGHWRLPSOHPHQWDQRQ\PRXVFODVVHVE\H[WHQGLQJDQH[LVWLQJFODVV
DQGE\LPSOHPHQWLQJDQLQWHUIDFH
223
224 CHAPTER 7: INNER CLASSES
1HVWHGFODVVHVFDQEHUHJDUGHGDVDIRUPRIHQFDSVXODWLRQHQIRUFLQJUHODWLRQVKLSV
EHWZHHQFODVVHVE\JUHDWHUSUR[LPLW\8VHGMXGLFLRXVO\WKH\FDQEHEHQHILFLDOEXW
XQUHVWUDLQHGQHVWLQJFDQHDVLO\UHVXOWLQLQFRPSUHKHQVLEOHFRGH
,Q([DPSOHWKHWRSOHYHOSDFNDJHPHPEHUFODVVTopLevelClassDWFRQWDLQVD
QHVWHGWRSOHYHOFODVVNestedTopLevelClassDWZKLFKLQWXUQGHILQHVDQHVWHGWRS
OHYHOLQWHUIDFHNestedTopLevelInterface1DWZKLFKLVLPSOHPHQWHGE\WKHQHVWHG
WRSOHYHOFODVV NestedTopLevelClass1DW1RWHWKDWHDFKQHVWHGWRSOHYHOFODVVLV
GHILQHGDVstaticMXVWOLNHstaticYDULDEOHVDQGPHWKRGVLQDFODVV
7KHIXOOQDPHRIDQHVWHGWRSOHYHOFODVVRULQWHUIDFHLQFOXGHVWKHQDPHRIWKHFODVV
LW LV GHILQHG LQ )RU H[DPSOH WKH IXOO QDPH RI WKH QHVWHG WRSOHYHO FODVV Nested
TopLevelClass1 DW LV TopLevelClass.NestedTopLevelClass.NestedTopLevelClass1
7KHIXOOQDPHRIWKHQHVWHGWRSOHYHOLQWHUIDFHNestedTopLevelInterface1DWLVTop
LevelClass.NestedTopLevelClass.NestedTopLevelInterface1 1RWH WKDW HDFK QHVWHG
WRSOHYHOFODVVRULQWHUIDFHLVXQLTXHO\LGHQWLILHGE\WKLVQDPLQJFRQYHQWLRQZKLFK
LVDJHQHUDOL]DWLRQRIWKHIXOO\TXDOLILHGQDPLQJVFKHPHIRUSDFNDJHPHPEHUV7KH
IXOOFODVVQDPHFDQEHXVHGLQDSURJUDPOLNHDQ\RWKHUFODVVRULQWHUIDFHQDPH
1RWH WKDW D QHVWHG FODVV FDQQRW KDYH WKH VDPH QDPH DV DQ HQFORVLQJ FODVV RU
SDFNDJH
SECTION 7.2: TOP-LEVEL NESTED CLASSES AND INTERFACES 227
,IWKHILOHTopLevelClass.javaFRQWDLQLQJWKHGHILQLWLRQVLQ([DPSOHLVFRPSLOHG
LWZLOOUHVXOWLQWKHJHQHUDWLRQRIWKHIROORZLQJFODVVILOHVZKHUHHDFKILOHFRUUHV
SRQGVWRDFODVVRULQWHUIDFHGHILQLWLRQ
TopLevelClass$NestedTopLevelClass$NestedTopLevelClass1.class
TopLevelClass$NestedTopLevelClass$NestedTopLevelInterface1.class
TopLevelClass$NestedTopLevelClass.class
TopLevelClass.class
1RWHKRZWKHIXOOFODVVQDPHFRUUHVSRQGVWRWKHILOHQDPHPLQXVWKHH[WHQVLRQ
ZLWKWKHGROODUVLJQ$UHSODFHGE\WKHGRWVLJQ.
$FOLHQWFDQXVHWKHimportVWDWHPHQWWRSURYLGHDVKRUWFXWIRUWKHQDPHVRIQHVWHG
WRSOHYHOFODVVHVDQGLQWHUIDFHV+HUHDUHVRPHYDULDWLRQVRQXVDJHRIWKH import
VWDWHPHQWIRUQHVWHGWRSOHYHOFODVVHVDQGLQWHUIDFHV
// Filename: Client1.java
import TopLevelClass.*; // (1)
// Filename: Client2.java
import TopLevelClass.NestedTopLevelClass.*; // (3)
public class Client2 {
NestedTopLevelClass1 objRef2 = new NestedTopLevelClass1(); // (4)
}
,QWKHILOHClient1.javaWKHimportVWDWHPHQWDWDOORZVWKHQHVWHGWRSOHYHOFODVV
NestedTopLevelClass1WREHUHIHUHQFHGDV NestedTopLevelClass.NestedTopLevelClass1
DVDWZKHUHDVLQWKHILOHClient2.javaWKHimportVWDWHPHQWDWZLOODOORZWKH
VDPHFODVVWREHUHIHUHQFHGXVLQJWKHVLPSOHQDPHDVDW$WWKHIXOOQDPHRI
WKHQHVWHGWRSOHYHOLQWHUIDFHLVXVHGLQDQimplementsFODXVH
)RUDOOLQWHQWVDQGSXUSRVHVDWRSOHYHOQHVWHGFODVVRULQWHUIDFHLVYHU\PXFKOLNH
DQ\ RWKHU WRSOHYHO SDFNDJH PHPEHU FODVV RU LQWHUIDFH 6WDWLF YDULDEOHV DQG
PHWKRGVEHORQJWRDFODVVDQGQRWWRLQVWDQFHVRIWKHFODVV7KHVDPHLVWUXHIRU
QHVWHGWRSOHYHOFODVVHV$VWDWLFQHVWHGWRSOHYHOFODVVFDQEHLQVWDQWLDWHGZLWK
RXWDQ\UHIHUHQFHWRDQ\LQVWDQFHRIWKHHQFORVLQJFRQWH[WLHREMHFWVRIDQHVWHG
WRSOHYHOFODVVFDQEHFUHDWHGZLWKRXWUHJDUGWRLWVQHVWLQJ([DPSOHVRIFUHDWLQJ
LQVWDQFHVRIQHVWHGWRSOHYHOFODVVHVDUHVKRZQDERYHDWDQGXVLQJWKH new
RSHUDWRU
6WDWLFPHWKRGVGRQRWKDYHD thisUHIHUHQFHDQGFDQWKHUHIRUHRQO\DFFHVVRWKHU
staticPHWKRGVDQGYDULDEOHVGLUHFWO\LQWKHFODVV7KLVDOVRDSSOLHVWRPHWKRGVLQ
228 CHAPTER 7: INNER CLASSES
D QHVWHG WRSOHYHO FODVV $ PHWKRG LQ D QHVWHG WRSOHYHO FODVV FDQ RQO\ GLUHFWO\
DFFHVVVWDWLFPHPEHUVLQWKHHQFORVLQJFODVVRULQWHUIDFHEXWQRWLQVWDQFHPHPEHUV
LQWKHHQFORVLQJFRQWH[W6LQFHQHVWHGWRSOHYHOFODVVHVDUHVWDWLFWKHLUPHWKRGVGR
QRWKDYHDQ\RXWHULQVWDQFHRIWKHHQFORVLQJFRQWH[W
)LJXUHLVDFODVVGLDJUDPWKDWLOOXVWUDWHVWRSOHYHOQHVWHGFODVVHVDQGLQWHUIDFHV
7KHVHDUHVKRZQDVPHPEHUVRIWKHHQFORVLQJFRQWH[WZLWKWKH^VWDWLF`WDJWRLQGLF
DWHWKDWWKH\DUHVWDWLFLHWKH\FDQEHLQVWDQWLDWHGZLWKRXWUHJDUGWRDQ\RXWHU
REMHFWRIWKHHQFORVLQJFRQWH[W6LQFHWKH\DUHPHPEHUVRIDFODVVRUDQLQWHUIDFH
WKHLUDFFHVVLELOLW\FDQEHVSHFLILHGH[DFWO\OLNHWKDWRIDQ\RWKHUPHPEHURIDFODVV
RULQWHUIDFH7KHFODVVHVIURPWKHGLDJUDPDUHLPSOHPHQWHGLQ([DPSOH
2XWSXWIURPWKHSURJUDP
staticMethod in NestedTopLevelClass
([DPSOHGHPRQVWUDWHVDFFHVVLQJPHPEHUVGLUHFWO\LQWKHHQFORVLQJFRQWH[WRI
FODVVNestedTopLevelClass1GHILQHGDW7KHLQLWLDOL]DWLRQDWLVYDOLGVLQFHWKH
YDULDEOHY2KGHILQHGLQWKHRXWHULQWHUIDFHNestedTopLevelInterface1DWLVLPSOLF
LWO\ VWDWLF 7KH FRPSLOHU ZLOO IODJ DQ HUURU DW DQG LQ PHWKRG another
NonStaticMethod() EHFDXVH GLUHFW DFFHVV WR QRQVWDWLF PHPEHUV LQ WKH HQFORVLQJ
FODVVLVQRWSHUPLWWHGE\DQ\PHWKRGLQDQHVWHGWRSOHYHOFODVV,WZLOODOVRIODJDQ
HUURUDWLQPHWKRGmain()EHFDXVHDVWDWLFPHWKRGFDQQRWDFFHVVGLUHFWO\RWKHU
QRQVWDWLFYDULDEOHVLQLWVRZQFODVV6WDWHPHQWVDWDQGRQO\DFFHVVstatic
PHPEHUVLQWKHHQFORVLQJFRQWH[W7KHUHIHUHQFHVLQWKHVHVWDWHPHQWVFDQDOVREH
VSHFLILHGXVLQJIXOOQDPHV
int ii = AccessInTopLevelClass.NestedTopLevelClass.i;
AccessInTopLevelClass.NestedTopLevelClass.staticMethod();
1RWHWKDWDWRSOHYHOQHVWHGFODVVFDQGHILQHERWK staticDQGLQVWDQFHPHPEHUV
OLNHDQ\RWKHUSDFNDJHOHYHOFODVV+RZHYHULWVFRGHFDQRQO\GLUHFWO\DFFHVVstatic
PHPEHUVLQLWVHQFORVLQJFRQWH[W
$WRSOHYHOQHVWHGFODVVEHLQJDPHPEHURIWKHHQFORVLQJFODVVRULQWHUIDFHFDQ
KDYHDQ\DFFHVVLELOLW\publicprotectedSDFNDJHGHIDXOWprivateOLNHDQ\RWKHU
PHPEHUVRIDFODVV7KHFODVV NestedTopLevelClassDWKDV privateDFFHVVLELOLW\
ZKHUHDVLWVQHVWHGFODVVNestedTopLevelClass1DWKDVprotectedDFFHVVLELOLW\7KH
FODVVNestedTopLevelClass1GHILQHVWKHPHWKRGmain()ZKLFKFDQEHH[HFXWHGE\WKH
FRPPDQG
java AccessInTopLevelClass$NestedTopLevelClass$NestedTopLevelClass1
1RWHWKDWWKHFODVVNestedTopLevelClass1LVVSHFLILHGXVLQJWKHIXOOQDPHRIWKHFODVV
ILOHPLQXVWKHH[WHQVLRQ
230 CHAPTER 7: INNER CLASSES
2XWSXWIURPWKHSURJUDP
Shine the inner light.
SECTION 7.3: NON-STATIC INNER CLASSES 231
,Q([DPSOHWKHFODVVToplevelClassDWGHILQHVDQRQVWDWLFLQQHUFODVVDW
'HFODUDWLRQRIDVWDWLFYDULDEOHLQFODVV NonStaticInnerClassZRXOGEHIODJJHGDVD
FRPSLOHWLPHHUURUDVDQRQVWDWLFLQQHUFODVVFDQQRWGHILQHstaticPHPEHUV
7KH QRQVWDWLF PHWKRG makeInstance() DW LQ WKH FODVV ToplevelClass FUHDWHV DQ
LQVWDQFH RI WKH NonStaticInnerClass XVLQJ WKH new RSHUDWRU DV VKRZQ DW 7KLV
FUHDWHVDQLQVWDQFHRIDQRQVWDWLFLQQHUFODVVLQWKHFRQWH[WRIWKHLQVWDQFHRIWKH
HQFORVLQJFODVVRQZKLFKWKHmakeInstance()PHWKRGLVLQYRNHG7KHmakeInstance()
PHWKRGLVFDOOHGDW7KHUHIHUHQFHWRDQREMHFWRIWKHQRQVWDWLFLQQHUFODVVFDQ
WKHQEHXVHGLQWKHQRUPDOZD\WRDFFHVVLWVPHPEHUVDVVKRZQDW$QDWWHPSW
WRFUHDWHDQLQVWDQFHRIWKHQRQVWDWLFLQQHUFODVVZLWKRXWDQRXWHULQVWDQFHXVLQJ
WKHnewRSHUDWRUZLWKWKHIXOOQDPHRIWKHLQQHUFODVVDVVKRZQDWUHVXOWVLQD
FRPSLOHWLPHHUURU$VSHFLDOIRUPRIWKHnewRSHUDWRUPXVWEHXVHGZKLFKLVLOOXV
WUDWHGDW
topRef.new NonStaticInnerClass(); // (16)
7KHH[SUHVVLRQHQFORVLQJREMHFWUHIHUHQFH!LQWKHV\QWD[
HQFORVLQJREMHFWUHIHUHQFH!.new
HYDOXDWHVWRDQLQVWDQFHRIWKHHQFORVLQJFODVVLQZKLFKWKHGHVLJQDWHGQRQVWDWLF
LQQHUFODVVLVGHILQHG,WLVDQHUURUWRVSHFLI\WKHIXOOQDPHRIWKHLQQHUFODVVDVWKH
HQFORVLQJ FRQWH[W LV DOUHDG\ JLYHQ E\ HQFORVLQJ REMHFW UHIHUHQFH! 7KH UHIHUHQFH
topRefGHQRWHVDQREMHFWRIFODVVToplevelClass$IWHUWKHH[HFXWLRQRIWKHVWDWHPHQW
DW WKH ToplevelClass REMHFW KDV WZR LQVWDQFHV RI WKH LQQHU FODVV NonStatic
InnerClassDVVRFLDWHGZLWKLW7KLVLVGHSLFWHGLQ)LJXUHZKHUHWKHRXWHUREMHFW
GHQRWHGE\ topRefRIFODVV ToplevelClassLVVKRZQZLWKLWVWZRDVVRFLDWHGLQQHU
REMHFWVGHQRWHGE\innerRef1DQGinnerRef3UHVSHFWLYHO\ULJKWDIWHUWKHH[HFXWLRQ
RIWKHVWDWHPHQWDW,QRWKHUZRUGVPXOWLSOHREMHFWVRIWKHLQQHUFODVVHVFDQEH
DVVRFLDWHGZLWKDQREMHFWRIDQHQFORVLQJFODVVDWUXQWLPH
topRef:ToplevelClass
innerRef1:NonStaticInnerClass
innerRef3:NonStaticInnerClass
$QLPSOLFLWUHIHUHQFHWRWKHHQFORVLQJREMHFWLVDOZD\VDYDLODEOHLQHYHU\PHWKRG
DQGFRQVWUXFWRURIDQRQVWDWLFLQQHUFODVV$PHWKRGFDQH[SOLFLWO\XVHWKLVUHIHU
HQFHZLWKDVSHFLDOIRUPRIWKHthisFRQVWUXFWDVH[SODLQHGEHORZ
)URPZLWKLQDQRQVWDWLFLQQHUFODVVLWLVSRVVLEOHWRUHIHUWRPHPEHUVLQWKHHQFORV
LQJFODVVGLUHFWO\$QH[DPSOHLVVKRZQDWZKHUHWKHLQVWDQFHYDULDEOHmsgIURP
WKH HQFORVLQJ FODVV LV DFFHVVHG LQ WKH QRQVWDWLF LQQHU FODVV ,W LV DOVR SRVVLEOH WR
232 CHAPTER 7: INNER CLASSES
H[SOLFLWO\UHIHUWRPHPEHUVLQWKHHQFORVLQJFODVVEXWWKLVUHTXLUHVVSHFLDOXVDJHRI
WKHthisUHIHUHQFH2QHPLJKWEHWHPSWHGWRGHILQHWKHFRQVWUXFWRUDWDVIROORZV
public NonStaticInnerClass() { this.string = this.msg; }
7KHUHIHUHQFHthis.stringLVFRUUHFWEHFDXVHWKHLQVWDQFHYDULDEOHstringFHUWDLQO\
EHORQJVWRWKHFXUUHQWREMHFWGHQRWHGE\thisRINonStaticInnerClassEXWthis.msg
FDQQRW SRVVLEO\ ZRUN DV WKH FXUUHQW REMHFW LQGLFDWHG E\ this RI NonStaticInner
ClassKDVQRLQVWDQFHYDULDEOHmsg7KHFRUUHFWV\QWD[LVWKHIROORZLQJ
7KHH[SUHVVLRQ
HQFORVLQJFODVVQDPH!.this
HYDOXDWHVWRDUHIHUHQFHWKDWGHQRWHVWKHHQFORVLQJREMHFWRIFODVVHQFORVLQJFODVV
QDPH!RIWKHFXUUHQWLQVWDQFHRIDQRQVWDWLFLQQHUFODVV
Example 7.4 Special Form of this and new Constructs in Non-static Inner Classes
// Filename: Client2.java
class TLClassA { // (1) Top-level Class
private String msg = "TLClassA object ";
public TLClassA(String objNo) { msg = msg + objNo; }
public void printMessage() { System.out.println(msg); }
class InnerB { // (2) Non-static Inner Class
private String msg = "InnerB object ";
public InnerB(String objNo) { msg = msg + objNo; }
public void printMessage() { System.out.println(msg); }
class InnerC { // (3) Non-static Inner Class
private String msg = "InnerC object ";
public InnerC(String objNo) { msg = msg + objNo; }
public void printMessage() {
System.out.println(msg); // (4)
System.out.println(this.msg); // (5)
System.out.println(InnerC.this.msg); // (6)
System.out.println(InnerB.this.msg); // (7)
InnerB.this.printMessage(); // (8)
System.out.println(TLClassA.this.msg); // (9)
TLClassA.this.printMessage(); // (10)
}
}
}
}
SECTION 7.3: NON-STATIC INNER CLASSES 233
2XWSXWIURPWKHSURJUDP
InnerC object 1
InnerC object 1
InnerC object 1
InnerB object 1
InnerB object 1
TLClassA object 1
TLClassA object 1
InnerC object 2
InnerC object 2
InnerC object 2
InnerB object 2
InnerB object 2
TLClassA object 2
TLClassA object 2
([DPSOHLOOXVWUDWHVWKHVSHFLDOIRUPRIWKHthisFRQVWUXFWWRDFFHVVPHPEHUVLQ
WKHHQFORVLQJFRQWH[WDQGDOVRGHPRQVWUDWHVWKHVSHFLDOIRUPRIWKHnewFRQVWUXFW
WRFUHDWHLQVWDQFHVRIQRQVWDWLFLQQHUFODVVHV7KHH[DPSOHVKRZVWKHFODVVInnerC
GHILQHGDWZKLFKLVQHVWHGLQWKHFODVV InnerBGHILQHGDWZKLFKLQWXUQLV
QHVWHGLQWKHWRSOHYHOFODVV TLClassADW$OOWKUHHFODVVHVKDYHD privateQRQ
VWDWLF StringYDULDEOH msgDQGDQRQVWDWLFPHWKRG printMessage()7KHVHPHPEHUV
DUHQRWRYHUULGGHQLQWKHLQQHUFODVVHVDVQRLQKHULWDQFHLVLQYROYHG/LNHDQ\RWKHU
FODVVPHPEHUWKH\KDYHFODVVVFRSH
7KH main()PHWKRGDWXVHVWKHDGGLWLRQDOV\QWD[RIWKH newRSHUDWRUWRFUHDWH
DQLQVWDQFHRI InnerCGHQRWHGE\ cDWLQWKHFRQWH[WRIDQLQVWDQFHRIFODVV
InnerBGHQRWHGE\bDWZKLFKLQWXUQLVFUHDWHGLQWKHFRQWH[WRIDQLQVWDQFH
RIFODVVTLClassAGHQRWHGE\aDW
7KH UHIHUHQFH c LV XVHG DW WR LQYRNH WKH PHWKRG printMessage() IURP FODVV
InnerC 7KLV PHWKRG XVHV WKH VWDQGDUG this UHIHUHQFH WR DFFHVV PHPEHUV RI WKH
REMHFWRQZKLFKLWLVLQYRNHGDVVKRZQDW,WDOVRXVHVWKHVSHFLDOIRUPRIWKH
thisFRQVWUXFWLQFRQMXQFWLRQZLWKWKHFODVVQDPHWRDFFHVVPHPEHUVLQRXWHU
REMHFWVZKLFKDUHDVVRFLDWHGZLWKWKHFXUUHQWREMHFWDVVKRZQLQWKHVWDWHPHQWV
IURPWKURXJK
234 CHAPTER 7: INNER CLASSES
:KHQWKHLQWHUYHQLQJUHIHUHQFHVWRDQRQVWDWLFLQQHUFODVVDUHRIQRLQWHUHVWWKH
newRSHUDWRUFDQEHFKDLQHGDVVKRZQDWDQG
&OLHQWVFDQXVHWKH importVWDWHPHQWWRSURYLGHDVKRUWFXWIRUWKHQDPHVRIQRQ
VWDWLFLQQHUFODVVHV([DPSOHEDVHGRQ([DPSOHVKRZVKRZQHVWHGFODVVHV
FDQEHLPSRUWHGDQGXVHG1RWHWKHVSHFLILFDWLRQRIWKHFODVVQDPHLQWKH import
VWDWHPHQW,W´LPSRUWVµWKHLPPHGLDWHQHVWHGFODVVHVDVVKRZQDW·)RUGHHSO\
QHVWHGLQQHUFODVVHVWKHLQWHUYHQLQJFODVVQDPHVPXVWEHVSHFLILHGDVVKRZQLQWKH
GHFODUDWLRQVDW··DQG·,IWKHFODVVTLClassAEHORQJHGWRDQDPHGSDFN
DJHWKHQWKHSDFNDJHQDPHPXVWEHSUHSHQGHGWRWKHFODVV·VQDPHLQWKHXVXDO
ZD\LQWKHimportVWDWHPHQW
2XWSXWIURPWKHSURJUDP
InnerC object 3
InnerC object 3
InnerC object 3
InnerB object 3
SECTION 7.3: NON-STATIC INNER CLASSES 235
InnerB object 3
TLClassA object 3
TLClassA object 3
2XWSXWIURPWKHSURJUDP
this.x: 2.17
A.this.x: 3.14
Review questions
:KDWZLOOEHWKHUHVXOWRIDWWHPSWLQJWRFRPSLOHDQGUXQWKHIROORZLQJFRGH"
public class MyClass {
public static void main(String args[]) {
Outer objRef = new Outer();
System.out.println(objRef.createInner().getSecret());
}
}
class Outer {
private int secret;
Outer() { secret = 123; }
class Inner {
int getSecret() { return secret; }
}
Inner createInner() { return new Inner(); }
}
6HOHFWWKHRQHULJKWDQVZHU
D 7KHFRGHZLOOIDLOWRFRPSLOHVLQFHWKHFODVV InnerFDQQRWEHGHFODUHGZLWKLQ
WKHFODVVOuter
E 7KH FRGH ZLOO IDLO WR FRPSLOH VLQFH WKH PHWKRG createInner() FDQQRW EH
DOORZHGWRSDVVREMHFWVRIWKHLQQHUFODVVInnerWRPHWKRGVRXWVLGHRIWKHFODVV
Outer
F 7KHFRGHZLOOIDLOWRFRPSLOHVLQFHWKH secretYDULDEOHLVQRWDFFHVVLEOHIURP
WKHPHWKRGgetSecret()
G 7KHFRGHZLOOIDLOWRFRPSLOHVLQFHWKHPHWKRGgetSecret()LVQRWYLVLEOHIURP
WKHmain()PHWKRGLQWKHFODVVMyClass
H 7KHFRGHZLOOFRPSLOHZLWKRXWHUURUDQGZLOOSULQW123ZKHQUXQ
:KLFKRIWKHVHVWDWHPHQWVFRQFHUQLQJQHVWHGFODVVHVDUHWUXH"
6HOHFWDOOYDOLGDQVZHUV
D $QLQVWDQFHRIDWRSOHYHOQHVWHGFODVVKDVDQLQKHUHQWRXWHULQVWDQFH
E $WRSOHYHOQHVWHGFODVVFDQFRQWDLQQRQVWDWLFPHPEHUYDULDEOHV
F $WRSOHYHOQHVWHGLQWHUIDFHFDQFRQWDLQQRQVWDWLFPHPEHUYDULDEOHV
G $WRSOHYHOQHVWHGLQWHUIDFHKDVDQLQKHUHQWRXWHULQVWDQFH
H )RUHDFKLQVWDQFHRIWKHRXWHUFODVVWKHUHFDQH[LVWPDQ\LQVWDQFHVRIDQRQ
VWDWLFLQQHUFODVV
SECTION 7.3: NON-STATIC INNER CLASSES 237
:KDWZLOOEHWKHUHVXOWRIDWWHPSWLQJWRFRPSLOHDQGUXQWKHIROORZLQJFRGH"
public class MyClass {
public static void main(String args[]) {
State st = new State();
System.out.println(st.getValue());
State.Memento mem = st.memento();
st.alterValue();
System.out.println(st.getValue());
mem.restore();
System.out.println(st.getValue());
}
public static class State {
protected int val = 11;
int getValue() { return val; }
void alterValue() { val = (val + 7) % 31; }
Memento memento() { return new Memento(); }
class Memento {
int val;
Memento() { this.val = State.this.val; }
void restore() { ((State) this).val = this.val; }
}
}
}
6HOHFWWKHRQHULJKWDQVZHU
D 7KHFRGHZLOOIDLOWRFRPSLOHVLQFHWKHVWDWLF main()PHWKRGWULHVWRFUHDWHD
QHZLQVWDQFHRIWKHLQQHUFODVVState
E 7KHFRGHZLOOIDLOWRFRPSLOHVLQFHWKHFODVVGHFODUDWLRQRIState.Memento LVQRW
YLVLEOHIURPWKHmain()PHWKRG
F 7KHFRGHZLOOIDLOWRFRPSLOHVLQFHWKHLQQHUFODVV MementoGHFODUHVDYDULDEOH
ZLWKWKHVDPHQDPHDVDYDULDEOHLQWKHRXWHUFODVVState
G 7KH FRGH ZLOO IDLO WR FRPSLOH VLQFH WKH Memento FRQVWUXFWRU WULHV DQ LQYDOLG
DFFHVVWKURXJKWKHState.this.valH[SUHVVLRQ
H 7KH FRGH ZLOO IDLO WR FRPSLOH VLQFH WKH Memento PHWKRG restore() WULHV DQ
LQYDOLGDFFHVVWKURXJKWKH((State) this).valH[SUHVVLRQ
I 7KHSURJUDPFRPSLOHVZLWKRXWHUURUVDQGSULQWV1118DQG11ZKHQUXQ
:KDWZLOOEHWKHUHVXOWRIDWWHPSWLQJWRFRPSLOHDQGUXQWKHIROORZLQJSURJUDP"
public class Nesting {
public static void main(String args[]) {
B.C obj = new B().new C();
}
}
class A {
int val;
A(int v) { val = v; }
}
238 CHAPTER 7: INNER CLASSES
class B extends A {
int val = 1;
B() { super(2); }
class C extends A {
int val = 3;
C() {
super(4);
System.out.println(B.this.val);
System.out.println(C.this.val);
System.out.println(super.val);
}
}
}
6HOHFWDOOYDOLGDQVZHUV
D 7KHSURJUDPZLOOIDLOWRFRPSLOH
E 7KH SURJUDP ZLOO FRPSLOH ZLWKRXW HUURU DQG SULQW 2 3 DQG 4 LQ WKDW RUGHU
ZKHQUXQ
F 7KH SURJUDP ZLOO FRPSLOH ZLWKRXW HUURU DQG SULQW 1 4 DQG 2 LQ WKDW RUGHU
ZKHQUXQ
G 7KH SURJUDP ZLOO FRPSLOH ZLWKRXW HUURU DQG SULQW 1 3 DQG 4 LQ WKDW RUGHU
ZKHQUXQ
H 7KH SURJUDP ZLOO FRPSLOH ZLWKRXW HUURU DQG SULQW 3 2 DQG 1 LQ WKDW RUGHU
ZKHQUXQ
LQZKLFKLWLVGHILQHG$PHWKRGFDQUHWXUQDQLQVWDQFHRIWKHORFDOFODVV7KHORFDO
FODVVW\SHPXVWWKHQEHDVVLJQDEOHWRWKHUHWXUQW\SHRIWKHPHWKRG,WFDQQRWEH
WKH VDPH DV WKH ORFDO FODVV W\SH VLQFH WKLV W\SH LV QRW DFFHVVLEOH RXWVLGH RI WKH
PHWKRG2IWHQDVXSHUW\SHRIWKHORFDOFODVVLVVSHFLILHGDVWKHUHWXUQW\SH
2XWSXWIURPWKHSURJUDP
Drawing a Circle of radius: 5.0
Drawing a Map.
Drawing a Map.
242 CHAPTER 7: INNER CLASSES
([DPSOHLOOXVWUDWHVKRZFOLHQWVFDQLQVWDQWLDWHORFDOFODVVHV7KHQRQVWDWLFORFDO
FODVV CircleDWLVGHILQHGLQWKHQRQVWDWLFPHWKRG createCircle()DWZKLFK
KDV WKH UHWXUQ W\SH Shape 7KH VWDWLF ORFDO FODVV Map DW LV GHILQHG LQ WKH VWDWLF
PHWKRG createMap() DW ZKLFK KDV WKH UHWXUQ W\SH IDrawable 7KH LQKHULWDQFH
KLHUDUFK\RIWKHORFDOFODVVHVDQGWKHLUVXSHUW\SHVShapeDQGIDrawableLVGHSLFWHG
LQ )LJXUH 7KH main() PHWKRG FUHDWHV D SRO\PRUSKLF DUUD\ drawables RI W\SH
IDrawableDWZKLFKLVLQLWLDOL]HGZLWKLQVWDQFHVRIWKHORFDOFODVVHV
IDrawable[] drawables = { // (10)
new Painter().createCircle(5), // (11) Object of non-static local class
Painter.createMap(), // (12) Object of static local class
new Painter().createMap() // (13) Object of static local class
};
&UHDWLQJDQLQVWDQFHRIDQRQVWDWLFORFDOFODVVUHTXLUHVDQLQVWDQFHRIWKHHQFORVLQJ
FODVV 7KH QRQVWDWLF PHWKRG createCircle() LV LQYRNHG RQ WKH LQVWDQFH RI WKH
HQFORVLQJFODVVWRFUHDWHDQLQVWDQFHRIWKHQRQVWDWLFORFDOFODVVDVVKRZQDW
,QWKHQRQVWDWLFPHWKRGWKHUHIHUHQFHWRWKHLQVWDQFHRIWKHHQFORVLQJFRQWH[WLV
SDVVHGLPSOLFLWO\LQWKHFRQVWUXFWRUFDOORIWKHQRQVWDWLFORFDOFODVVDW
$ VWDWLF PHWKRG FDQ EH LQYRNHG HLWKHU WKURXJK WKH FODVV QDPH RU WKURXJK DQ
LQVWDQFHRIWKHFODVV$QLQVWDQFHRIDVWDWLFORFDOFODVVFDQEHFUHDWHGLQHLWKHUZD\
E\FDOOLQJWKHcreateMap()PHWKRGDVVKRZQDWDQG$VPLJKWEHH[SHFWHG
QRRXWHUREMHFWLVLQYROYHG
$VUHIHUHQFHVWRDORFDOFODVVFDQQRWEHGHFODUHGRXWVLGHRIWKHORFDOFRQWH[WWKH
IXQFWLRQDOLW\ RI WKH FODVV LV RQO\ DYDLODEOH WKURXJK VXSHUW\SH UHIHUHQFHV 7KH
PHWKRGdraw()LVLQYRNHGRQREMHFWVLQWKHDUUD\DW7KHSURJUDPRXWSXWLQGLF
DWHVZKLFKREMHFWVZHUHFUHDWHG,QSDUWLFXODUQRWHWKDWWKHfinalSDUDPHWHUradius
RIWKHPHWKRG createCircle()DWLVDFFHVVHGE\WKH draw()PHWKRGRIWKHORFDO
FODVVCircleDW$QLQVWDQFHRIWKHORFDOFODVVCircleLVFUHDWHGDWE\DFDOOWR
WKHPHWKRG createCircle()7KH draw()PHWKRGLVLQYRNHGRQWKLVLQVWDQFHRIWKH
ORFDOFODVVCircleLQWKHORRSDW7KHYDOXHRIWKHfinalSDUDPHWHUradiusLVVWLOO
DFFHVVLEOHWRWKH draw()PHWKRGLQYRNHGRQWKLVLQVWDQFHDOWKRXJKWKHFDOOWRWKH
PHWKRG createCircle() ZKLFK FUHDWHG WKH LQVWDQFH LQ WKH ILUVW SODFH KDV FRP
SOHWHG9DOXHVRIfinalORFDOYDULDEOHVFRQWLQXHWREHDYDLODEOHWRLQVWDQFHVRIORFDO
FODVVHVZKHQHYHUWKHVHYDOXHVDUHQHHGHG
7KHRXWSXWDOVRVKRZVWKHDFWXDOQDPHVRIWKHORFDOFODVVHV,QIDFWWKHORFDOFODVV
QDPHVDUHUHIOHFWHGLQWKHFODVVILOHQDPHV
SECTION 7.5: ANONYMOUS CLASSES 243
2XWSXWIURPWKHSURJUDP
Drawing a new Shape.
Drawing a new IDrawable.
Drawing a new IDrawable.
Anonymous Class Names:
class Painter$1
class Painter$2
&ODVV GHILQLWLRQV IURP ([DPSOH ZKLFK LV DQ DGDSWDWLRQ RI ([DPSOH WR
DQRQ\PRXV FODVVHV DUH VKRZQ EHORZ 7KH LQVWDQFH PHWKRG createShape() DW
GHILQHVDQRQVWDWLFDQRQ\PRXVFODVVDWZKLFKH[WHQGVWKHVXSHUFODVV Shape
7KHDQRQ\PRXVFODVVRYHUULGHVWKHLQKHULWHGPHWKRG draw()$VUHIHUHQFHVWRDQ
DQRQ\PRXVFODVVFDQQRWEHGHFODUHGWKHIXQFWLRQDOLW\RIWKHFODVVLVRQO\DYDLODEOH
WKURXJKVXSHUFODVVUHIHUHQFHV8VXDOO\LWPDNHVVHQVHWRHLWKHURYHUULGHPHWKRGV
IURPWKHVXSHUFODVVRULPSOHPHQWDEVWUDFWPHWKRGVIURPWKHVXSHUFODVV$Q\RWKHU
PHPEHUVLQWKHGHILQLWLRQRIDQDQRQ\PRXVFODVVFDQQRWEHDFFHVVHG
// ...
class Shape implements IDrawable { // (2)
public void draw() { System.out.println("Drawing a Shape."); }
}
}
// ...
}
// ...
Implementing an Interface
7KH IROORZLQJ V\QWD[ FDQ EH XVHG IRU GHILQLQJ DQG LQVWDQWLDWLQJ DQ DQRQ\PRXV
FODVVWKDWLPSOHPHQWVDQLQWHUIDFHVSHFLILHGE\LQWHUIDFHQDPH!
new LQWHUIDFHQDPH! () { FODVVGHFODUDWLRQV! }
$Q DQRQ\PRXV FODVV SURYLGHV D VLQJOH LQWHUIDFH LPSOHPHQWDWLRQ DQG QR DUJX
PHQWVDUHSDVVHG7KHDQRQ\PRXVFODVVLPSOLFLWO\H[WHQGVWKH ObjectFODVV1RWH
WKDWQRimplementsFODXVHLVXVHGLQWKHFRQVWUXFW
$Q DQRQ\PRXV FODVV LPSOHPHQWLQJ DQ LQWHUIDFH LV VKRZQ EHORZ 'HWDLOV FDQ EH
IRXQGLQ([DPSOH7KHVWDWLFPHWKRG createIDrawable()DWGHILQHVD static
DQRQ\PRXVFODVVDWZKLFKLPSOHPHQWVWKHLQWHUIDFHIDrawableE\SURYLGLQJDQ
LPSOHPHQWDWLRQRIWKHPHWKRGdraw()7KHIXQFWLRQDOLW\RIREMHFWVRIDQDQRQ\P
RXV FODVV ZKLFK LPSOHPHQWV DQ LQWHUIDFH LV DYDLODEOH WKURXJK UHIHUHQFHV RI WKH
LQWHUIDFHW\SHDQGWKHObjectW\SH
interface IDrawable { // (1)
void draw();
}
// ...
class Painter { // (3) Top-level Class
// ...
public static IDrawable createIDrawable() { // (7) Static Method
return new IDrawable(){ // (8) Implements interface
public void draw() {
System.out.println("Drawing a new IDrawable.");
}
};
}
}
// ...
7KHQDPHVRIWKHDQRQ\PRXVFODVVHVDWUXQWLPHDUHDOVRVKRZQLQWKHSURJUDP
RXWSXW 7KH\ DUH DOVR WKH QDPHV XVHG WR GHVLJQDWH WKHLU UHVSHFWLYH FODVV ILOHV
$QRQ\PRXVFODVVHVDUHQRWVRDQRQ\PRXVDIWHUDOO
class SuperC {
protected double y;
protected static int m;
}
class TopLevelA extends SuperC { // Top-level Class
private double z;
private static int p;
SuperB b = new SuperB() { // (1) Non-static anonymous class
// static double d; // (2) Not OK. Only non-static members allowed.
double zz = TopLevelA.this.z;// (3) non-static from enclosing class.
int pp = p; // (4) static from enclosing class.
double yy = y; // (5) inherited by enclosing class.
int mm = m; // (6) static from enclosing class.
double xx = this.x; // (7) non-static inherited from superclass.
int nn = this.n; // (8) static from superclass.
};
SECTION 7.5: ANONYMOUS CLASSES 247
Review questions
:KLFKRIWKHIROORZLQJVWDWHPHQWVDUHWUXH"
6HOHFWDOOYDOLGDQVZHUV
D 1RQVWDWLFLQQHUFODVVHVPXVWKDYHHLWKHUGHIDXOWRUpublicDFFHVVLELOLW\
E $OOQHVWHGFODVVHVFDQFRQWDLQRWKHUWRSOHYHOQHVWHGFODVVHV
F 0HWKRGVLQDOOQHVWHGFODVVHVFDQEHGHFODUHGstatic
G $OOQHVWHGFODVVHVFDQEHGHFODUHGstatic
H 7RSOHYHOQHVWHGFODVVHVFDQFRQWDLQQRQVWDWLFPHWKRGV
*LYHQWKHGHFODUDWLRQ
interface IntHolder { int getInt(); }
ZKLFKRIWKHIROORZLQJPHWKRGVDUHYDOLG"
//----(1)----
IntHolder makeIntHolder(int i) {
return new IntHolder() {
public int getInt() { return i; }
};
}
//----(2)----
IntHolder makeIntHolder(final int i) {
return new IntHolder {
public int getInt() { return i; }
};
}
//----(3)----
IntHolder makeIntHolder(int i) {
class MyIH implements IntHolder {
public int getInt() { return i; }
}
248 CHAPTER 7: INNER CLASSES
6HOHFWDOOYDOLGDQVZHUV
D 7KHPHWKRGODEHOHG
E 7KHPHWKRGODEHOHG
F 7KHPHWKRGODEHOHG
G 7KHPHWKRGODEHOHG
H 7KHPHWKRGODEHOHG
:KLFKRIWKHVHVWDWHPHQWVDUHWUXH"
6HOHFWDOOYDOLGDQVZHUV
D <RXFDQQRWGHFODUHVWDWLFPHPEHUVZLWKLQDQRQVWDWLFLQQHUFODVV
E ,IDQRQVWDWLFLQQHUFODVVLVQHVWHGZLWKLQDFODVVQDPHG OuterWKHQPHWKRGV
ZLWKLQWKHQRQVWDWLFLQQHUFODVVPXVWXVHWKHSUHIL[ Outer.thisWRDFFHVVWKH
PHPEHUVRIWKHFODVVOuter
F $OOPHPEHUYDULDEOHVLQDQ\QHVWHGFODVVPXVWEHGHFODUHGfinal
G $QRQ\PRXVFODVVHVFDQQRWKDYHFRQVWUXFWRUV
H ,I objRefLVDQLQVWDQFHRIDQ\QHVWHGFODVVZLWKLQWKHFODVVOuterWKHQ (objRef
instanceof Outer)ZRXOG\LHOGWUXH
:KLFKRIWKHIROORZLQJVWDWHPHQWVDUHWUXH"
6HOHFWDOOYDOLGDQVZHUV
D 3DFNDJHPHPEHUFODVVHVFDQEHGHFODUHGstatic
E &ODVVHVGHFODUHGDVPHPEHUVRIWRSOHYHOFODVVHVFDQEHGHFODUHGstatic
F /RFDOFODVVHVFDQEHGHFODUHGstatic
G $QRQ\PRXVFODVVHVFDQEHGHFODUHGstatic
H 1RFODVVHVFDQEHGHFODUHGstatic
SECTION 7.5: ANONYMOUS CLASSES 249
Chapter summary
7KHIROORZLQJLQIRUPDWLRQZDVLQFOXGHGLQWKLVFKDSWHU
&DWHJRULHVRIQHVWHGFODVVHVWRSOHYHOQHVWHGFODVVHVDQGLQWHUIDFHVQRQVWDWLF
LQQHUFODVVHVORFDOFODVVHVDQRQ\PRXVFODVVHV
7KHIROORZLQJDVSHFWVSHUWDLQLQJWRQHVWHGFODVVHVDQGLQWHUIDFHVDUHGLVFXVVHG
❍ 7KHFRQWH[WLQZKLFKWKH\FDQEHGHILQHG
❍ :KDWDFFHVVLELOLW\PRGLILHUVDUHYDOLGIRUVXFKFODVVHVDQGLQWHUIDFHV
❍ :KHWKHUDQLQVWDQFHRIWKHRXWHUFRQWH[WLVDVVRFLDWHGZLWKDQLQVWDQFHRIWKH
QHVWHGFODVV
❍ :KDWHQWLWLHVLQLWVRXWHUFRQWH[WDQHVWHGFODVVRULQWHUIDFHFDQDFFHVV
❍ :KHWKHUERWKVWDWLFDQGQRQVWDWLFPHPEHUVFDQEHGHILQHGLQDQHVWHGFODVV
,PSRUWLQJDQGXVLQJQHVWHGFODVVHVDQGLQWHUIDFHV
$FFHVVLQJ PHPEHUV LQ WKH RXWHU FRQWH[W XVLQJ HQFORVLQJ FODVV QDPH!.this
V\QWD[
,QVWDQWLDWLQJ LQVWDQFHV RI QHVWHG FODVVHV XVLQJ HQFORVLQJ REMHFW UHIHUHQFH!.new
V\QWD[
'LVFXVVLRQRIWKHLQKHULWDQFHDQGFRQWDLQPHQWKLHUDUFKLHVRIQHVWHGFODVVHV
,PSOHPHQWLQJDQRQ\PRXVFODVVHVE\H[WHQGLQJDQH[LVWLQJFODVVDQGE\LPSOH
PHQWLQJDQLQWHUIDFH
Programming exercise
&UHDWHDQHZSURJUDPZLWKDQHVWHGFODVVQDPHGPrintFuncWKDWH[WHQGVWKHPrint
FODVVLQ([HUFLVH,QDGGLWLRQWRMXVWSULQWLQJWKHYDOXH PrintFuncVKRXOGILUVW
DSSO\DFunctionREMHFWRQWKHYDOXH7KHPrintFuncFODVVVKRXOGKDYHDFRQVWUXFWRU
WKDW WDNHV DQ LQVWDQFH RI Function DV D SDUDPHWHU 7KH evaluate() PHWKRG RI
PrintFuncVKRXOGXVHWKH FunctionREMHFWRQLWVDUJXPHQW7KH evaluate()PHWKRG
VKRXOG SULQW DQG UHWXUQ WKH UHVXOW 7KH evaluate() PHWKRG LQ VXSHUFODVV Print
VKRXOGEHXVHGWRSULQWWKHYDOXH
0DNH WKH SURJUDP EHKDYH MXVW OLNH WKH SURJUDP LQ ([HUFLVH EXW QRZ XVLQJ
PrintFuncLQVWHDGRIPrint