1.2.3 在外部类中定义内部类 如下所示代码为在外部类中定义两个内部类及它们的调用关系:: W5 `" U0 A6 d% s: ?
public class Outer{6 z0 o- z9 |# L5 C
int outer_x = 100;; q, ^1 r6 [" s ?1 R" x+ e
class Inner{
% k( R& k8 B+ K1 h' d7 B public int y = 10;3 M9 x2 ]; `% v% _8 W# E# k3 T, X
private int z = 9;
U! ?% A5 F- e/ i5 m1 m/ Y2 x int m = 5;
( ^0 J8 c; }. a3 b7 s5 Q2 d public void display(){5 M5 H3 m9 v' b; ^ a% h2 h, r
System.out.println("display outer_x:"+ outer_x);
8 o8 M- a( I4 ^* q }
5 e' S& v- H P; k Z private void display2(){ q0 r2 b& z/ j% S
System.out.println("display outer_x:"+ outer_x);
) o$ {; j) Q% y+ F. K' C }6 A n8 k4 A X8 S4 ~0 W
}1 t; T3 X( ?' o+ b
void test(){
# x( @% h4 A7 _ Inner inner = new Inner();
! h7 A2 w" d. V2 T" M inner.display();0 z6 D5 r% c- s( P& `& H1 C0 ~
inner.display2();3 f$ u2 d: C7 X$ r7 [) A$ _$ H
//System.out.println("Inner y:" + y);//不能访问内部内变量! _4 q6 H9 ]* g& S4 x0 v! l
System.out.println("Inner y:" + inner.y);//可以访问
6 K4 N% `6 N' q, O6 j" D% `% \' i System.out.println("Inner z:" + inner.z);//可以访问
4 b* F4 }* Q4 Z System.out.println("Inner m:" + inner.m);//可以访问
$ E& \, A6 e, e1 s! }* q N InnerTwo innerTwo = new InnerTwo();
& I$ P& z. w, a# T& K1 W innerTwo.show();2 t9 d3 N4 j8 _6 x2 x4 L8 ^
}# i) I( e! D$ a, M2 {: G5 c8 ]. t8 q
class InnerTwo{
: N% L, f) r6 ?. u, N0 N Inner innerx = new Inner();. S7 Q$ f5 _* r- I. Q
public void show(){
2 }7 E% N" _" G9 _& R //System.out.println(y);//不可访问Innter的y成员
( P& C7 z! r. R5 u; ] //System.out.println(Inner.y);//不可直接访问Inner的任何成员和方法: }3 Z, q1 }( P! r6 K/ B
innerx.display();//可以访问
( S( w3 |1 `5 w% P* c innerx.display2();//可以访问# L# }/ l* ~# v& o
System.out.println(innerx.y);//可以访问% ?+ Z* S1 T* i k
System.out.println(innerx.z);//可以访问
& }2 E1 I8 H' q; R f System.out.println(innerx.m);//可以访问
) s* C" `3 T8 J) J6 ^ }) z- x, G5 u8 _6 j* \# L
}( A. d# u" [6 L7 n
public static void main(String args[]){
" s! k. v% S3 V% C! S Outer outer = new Outer();
% U3 u c' E' v6 Z# V" [8 K outer.test();
5 E5 Y0 S: d& R" h h# N }
: I' v- f- ]& Q }' h$ i1 _" v( b/ j
以上代码需要说明有,对于内部类,通常在定义类的class关键字前不加public 或 private等限制符,若加了
# b/ c* g; H) q9 K- |# C 没有任何影响,同时好像这些限定符对内部类的变量和方法也没有影响(?)。另外,就是要注意,内部类Inner及
# U. `+ |/ K* o2 ] InnterTwo只在类Outer的作用域内是可知的,如果类Outer外的任何代码尝试初始化类Inner或使用它,编译就不
& l9 t& ]" a% x4 F; n* S7 |% W1 a 会通过。同时,内部类的变量成员只在内部内内部可见,若外部类或同层次的内部类需要访问,需采用示例程序' U F4 K& R3 h0 L. Z/ R6 e
中的方法,不可直接访问内部类的变量。 |