2008年4月14日 星期一

inner.java, a sample code for 6 kinds of java classes inside classes/methods

  1. /*
  2.  
  3. Inner.java
  4.  
  5. Demo for a variety of inner classes which include
  6.  
  7. 1. static nested classes: 類別內具名靜態類別 InClassStaticClass
  8. no associated outer class instance.
  9.  
  10. 2. inner nested classes: 類別內具名非靜態類別 InClassInstanceClass
  11. with an associated outer class instance.
  12.  
  13. 3. anonymous classes: 方法內匿名類別 adapted from InMethodUnnamedClass
  14. unnamed inner class defined in the middle of a method.
  15.  
  16. 4. local classes: 方法內具名類別 InMethodStaticClass, InMethodInstanceClass
  17. named inner class defined in the middle of a method.
  18.  
  19. 實際展示6種內部類別(inner class)寫法:
  20. 1.類別內具名靜態類別,InClassStaticClass
  21. 2.類別內具名非靜態類別,InClassInstanceClass
  22. 3.類別方法內具名靜態類別,InMethodStaticClass
  23. 4.物件方法內具名非靜態類別,InMethodInstanceClass
  24. 5.類別方法內匿名靜態類別,adapted from InMethodUnnamedClass
  25. 6.物件方法內匿名非靜態類別,adapted from InMethodUnnamedClass
  26.  
  27. Note:
  28. 1.StaticClass can directly instantiate without an instance.
  29. An inner InstanceClass can have static and instance members,
  30. but can only access outer class static members.
  31. Members include attributes and methods.
  32. Most classes are named StaticClass.
  33. 2.InstanceClass must instantiate from an instance.
  34. An inner InstanceClass can only have instance members,
  35. but can access outer class static and instance members.
  36. 3.Methods provide a non-static context and
  37. do not allow static declarations inside.
  38. All intra method inner classes can add
  39. new instance but not static members.
  40. 4.Unnamed inner classes are adapted inline from known classes,
  41. and must be in a method, not in a class.
  42. They can add new instance but not static members and
  43. access old public but not private members of known classes.
  44.  
  45. Ref:
  46. http://www.blogjava.net/blackbat/archive/2006/10/04/73352.html
  47.  
  48. 執行方法及結果
  49.  
  50. > javac Inner.java
  51. > java Inner
  52. 我是<外部類別OuterClass>物件,擁有
  53. 類別屬性outerStaticAttribute
  54. 物件屬性outerInstanceAttribute
  55. 類別方法outerStaticMethod
  56. 物件方法outerInstanceMethod
  57.  
  58. 1.使用類別內具名靜態類別...
  59. 我是<類別內具名靜態類別InClassStaticClass>物件,擁有
  60. 類別屬性innerStaticAttribute
  61. 物件屬性innerInstanceAttribute
  62. 類別方法innerStaticMethod
  63. 物件方法innerInstanceMethod
  64. 從類別方法innerStaticMethod,我可以:
  65. 存取 外部類別之類別屬性outerStaticAttribute
  66. 存取 內部類別之類別屬性innerStaticAttribute
  67. 呼叫 外部類別之類別方法outerStaticMethod
  68. 從物件方法innerInstanceMethod,我可以:
  69. 存取 外部類別之類別屬性outerStaticAttribute
  70. 存取 內部類別之類別屬性innerStaticAttribute
  71. 存取 內部類別之物件屬性innerInstanceAttribute
  72. 呼叫 外部類別之類別方法outerStaticMethod
  73.  
  74. 2.使用類別內具名非靜態類別...
  75. 我是<類別內具名非靜態類別InClassInstanceClass>物件,擁有
  76. x類別屬性
  77. 物件屬性innerInstanceAttribute
  78. x類別方法
  79. 物件方法innerInstanceMethod
  80. 從物件方法innerInstanceMethod,我可以:
  81. 存取 外部類別之類別屬性outerStaticAttribute
  82. 存取 外部類別之物件屬性outerInstanceAttribute
  83. 存取 內部類別之物件屬性innerInstanceAttribute
  84. 呼叫 外部類別之類別方法outerStaticMethod
  85. 呼叫 外部類別之物件方法outerInstanceMethod
  86.  
  87. 3.使用類別方法內具名靜態類別...
  88. 我是<方法內具名靜態類別InMethodStaticClass>物件,擁有
  89. x類別屬性
  90. 物件屬性innerInstanceAttribute
  91. x類別方法
  92. 物件方法innerInstanceMethod
  93. 從物件方法innerInstanceMethod,我可以:
  94. 存取 外部類別之類別屬性outerStaticAttribute
  95. 存取 內部類別之物件屬性innerInstanceAttribute
  96. 呼叫 外部類別之類別方法outerStaticMethod
  97.  
  98. 4.使用物件方法內具名非靜態類別...
  99. 我是<方法內具名非靜態類別InMethodInstanceClass>物件,擁有
  100. x類別屬性
  101. 物件屬性innerInstanceAttribute
  102. x類別方法
  103. 物件方法innerInstanceMethod
  104. 從物件方法innerInstanceMethod,我可以:
  105. 存取 外部類別之類別屬性outerStaticAttribute
  106. 存取 外部類別之物件屬性outerInstanceAttribute
  107. 存取 內部類別之物件屬性innerInstanceAttribute
  108. 呼叫 外部類別之類別方法outerStaticMethod
  109. 呼叫 外部類別之物件方法outerInstanceMethod
  110.  
  111. 5.使用類別方法內匿名靜態類別...
  112. 我是<方法內匿名靜態類別 adapted from InMethodUnnamedClass>物件,擁有
  113. 類別屬性innerStaticAttribute.2
  114. 物件屬性innerInstanceAttribute,2,3
  115. 類別方法innerStaticMethod
  116. 物件方法innerInstanceMethod
  117. 從類別方法innerStaticMethod,我可以:
  118. 存取 私密 內部類別之類別屬性innerStaticAttribute
  119. 存取 公開 內部類別之類別屬性innerStaticAttribute2
  120. 從 覆寫的 物件方法innerInstanceMethod,我可以:
  121. 存取 外部類別之類別屬性outerStaticAttribute
  122. 存取 舊有公開 內部類別之類別屬性innerStaticAttribute2
  123. 存取 舊有公開 內部類別之物件屬性innerInstanceAttribute2
  124. 存取 添加私密 內部類別之物件屬性innerInstanceAttribute3
  125. 呼叫 外部類別之類別方法outerStaticMethod
  126.  
  127. 6.使用物件方法內匿名非靜態類別...
  128. 我是<方法內匿名非靜態類別 adapted from InMethodUnnamedClass>物件,擁有
  129. 類別屬性innerStaticAttribute,2
  130. 物件屬性innerInstanceAttribute,2,3
  131. 類別方法innerStaticMethod
  132. 物件方法innerInstanceMethod
  133. 從類別方法innerStaticMethod,我可以:
  134. 存取 私密 內部類別之類別屬性innerStaticAttribute
  135. 存取 公開 內部類別之類別屬性innerStaticAttribute2
  136. 從 覆寫的 物件方法innerInstanceMethod,我可以:
  137. 存取 外部類別之類別屬性outerStaticAttribute
  138. 存取 外部類別之物件屬性outerInstanceAttribute
  139. 存取 舊有公開 內部類別之類別屬性innerStaticAttribute2
  140. 存取 舊有公開 內部類別之物件屬性innerInstanceAttribute2
  141. 存取 添加私密 內部類別之物件屬性innerInstanceAttribute3
  142. 呼叫 外部類別之類別方法outerStaticMethod
  143. 呼叫 外部類別之物件方法outerInstanceMethod
  144. */
  145. class OuterClass {
  146. private static String outerStaticAttribute = "外部類別之類別屬性outerStaticAttribute";
  147. private String outerInstanceAttribute = "外部類別之物件屬性outerInstanceAttribute";
  148.  
  149. public OuterClass() {
  150. System.out.println(this);
  151. }
  152.  
  153. public String toString() {
  154. String text = "";
  155.  
  156. text = text + "我是<外部類別OuterClass>物件,擁有\n";
  157. text = text + "\t類別屬性outerStaticAttribute\n";
  158. text = text + "\t物件屬性outerInstanceAttribute\n";
  159. text = text + "\t類別方法outerStaticMethod\n";
  160. text = text + "\t物件方法outerInstanceMethod";
  161.  
  162. return text;
  163. }
  164.  
  165. // 外部類別靜態方法
  166. public static void outerStaticMethod() {
  167. System.out.println(" 呼叫 外部類別之類別方法outerStaticMethod");
  168. }
  169.  
  170. public static void outerStaticMethod2() {
  171. class InMethodStaticClass {
  172. //private static String innerStaticAttribute = "內部類別之類別屬性innerStaticAttribute";
  173. // inner classes cannot have static declarations
  174. private String innerInstanceAttribute = "內部類別之物件屬性innerInstanceAttribute";
  175.  
  176. public InMethodStaticClass() {
  177. System.out.println("我是<方法內具名靜態類別InMethodStaticClass>物件,擁有");
  178. System.out.println("\tx類別屬性");
  179. System.out.println("\t物件屬性innerInstanceAttribute");
  180. System.out.println("\tx類別方法");
  181. System.out.println("\t物件方法innerInstanceMethod");
  182. }
  183.  
  184. public String toString() {
  185. return "我是<方法內具名靜態類別>物件";
  186. }
  187.  
  188. //public static void innerStaticMethod()
  189. // inner classes cannot have static declarations
  190. /*
  191. {
  192. System.out.println( " 從類別方法innerStaticMethod,我可以:");
  193. System.out.println( " 存取 " + outerStaticAttribute);
  194. //System.out.println( " 存取 " + outerInstanceAttribute);
  195. // non-static variable cannot be referenced from a static context
  196. System.out.println( " 存取 " + innerStaticAttribute);
  197. //System.out.println( " 存取 " + innerInstanceAttribute);
  198. // non-static variable cannot be referenced from a static context
  199. outerStaticMethod();
  200. //outerInstanceMethod();
  201. // non-static method cannot be referenced from a static context
  202. }
  203. */
  204.  
  205. public void innerInstanceMethod() {
  206. System.out.println(" 從物件方法innerInstanceMethod,我可以:");
  207. System.out.println(" 存取 " + outerStaticAttribute);
  208. //System.out.println( " 存取 " + outerInstanceAttribute);
  209. // non-static variable cannot be referenced from a static context
  210. //System.out.println( " 存取 " + innerStaticAttribute);
  211. // non-static variable cannot be referenced from a static context
  212. System.out.println(" 存取 " + innerInstanceAttribute);
  213. outerStaticMethod();
  214. //outerInstanceMethod();
  215. // non-static method cannot be referenced from a static context
  216. }
  217. }
  218.  
  219. InMethodStaticClass imsc = new InMethodStaticClass();
  220. //imnic.innerStaticMethod();
  221. imsc.innerInstanceMethod();
  222. }
  223.  
  224. public static void outerStaticMethod3() {
  225. InMethodUnnamedClass imuc = new InMethodUnnamedClass() {
  226. //private static String innerStaticAttribute3 = "內部類別之類別屬性innerStaticAttribute";
  227. // inner classes cannot have static declarations
  228. private String innerInstanceAttribute3 = "內部類別之物件屬性innerInstanceAttribute3";
  229.  
  230. public String toString() {
  231. String text = "";
  232.  
  233. text = text + "我是<方法內匿名靜態類別 adapted from InMethodUnnamedClass>物件,擁有\n";
  234. text = text + "\t類別屬性innerStaticAttribute.2\n";
  235. text = text + "\t物件屬性innerInstanceAttribute,2,3\n";
  236. text = text + "\t類別方法innerStaticMethod\n";
  237. text = text + "\t物件方法innerInstanceMethod";
  238.  
  239. return text;
  240. }
  241.  
  242. //cannot overwrite constructor
  243. // invalid method declaration; return type required
  244. //public InMethodUnnamedClass()
  245. /*{
  246. System.out.println( "我是<方法內匿名非靜態類別>物件,擁有" );
  247. System.out.println( "\tx類別屬性" );
  248. System.out.println( "\t物件屬性innerInstanceAttribute" );
  249. System.out.println( "\tx類別方法" );
  250. System.out.println( "\t物件方法innerInstanceMethod" );
  251. }*/
  252.  
  253. //public static void innerStaticMethod()
  254. // inner classes cannot have static declarations
  255. /*
  256. {
  257. System.out.println( " 從類別方法innerStaticMethod,我可以:");
  258. System.out.println( " 存取 " + outerStaticAttribute);
  259. //System.out.println( " 存取 " + outerInstanceAttribute);
  260. // non-static variable cannot be referenced from a static context
  261. System.out.println( " 存取 " + innerStaticAttribute);
  262. //System.out.println( " 存取 " + innerInstanceAttribute);
  263. // non-static variable cannot be referenced from a static context
  264. outerStaticMethod();
  265. //outerInstanceMethod();
  266. // non-static method cannot be referenced from a static context
  267. }
  268. */
  269.  
  270. // overwriting method must exist in prototype class
  271. public void innerInstanceMethod() {
  272. System.out.println(" 從 覆寫的 物件方法innerInstanceMethod,我可以:");
  273. System.out.println(" 存取 " + outerStaticAttribute);
  274. //System.out.println( " 存取 " + outerInstanceAttribute);
  275. // non-static variable cannot be referenced from a static context
  276. //System.out.println( " 存取 舊有私密 " + innerStaticAttribute);
  277. // innerStaticAttribute has private access in InMethodUnnamedClass
  278. System.out.println(" 存取 舊有公開 " + innerStaticAttribute2);
  279. //System.out.println( " 存取 添加私密 " + innerStaticAttribute3);
  280. //System.out.println( " 存取 " + innerInstanceAttribute);
  281. // innerInstanceAttribute has private access in InMethodUnnamedClass
  282. System.out.println(" 存取 舊有公開 " + innerInstanceAttribute2);
  283. System.out.println(" 存取 添加私密 " + innerInstanceAttribute3);
  284. outerStaticMethod();
  285. //outerInstanceMethod();
  286. // non-static method cannot be referenced from a static context
  287. }
  288. };
  289.  
  290. imuc.innerStaticMethod();
  291. imuc.innerInstanceMethod();
  292. }
  293.  
  294. // 外部類別物件方法
  295. public void outerInstanceMethod() {
  296. System.out.println(" 呼叫 外部類別之物件方法outerInstanceMethod");
  297. }
  298.  
  299. public void outerInstanceMethod2() {
  300. class InMethodInstanceClass {
  301. //private static String innerStaticAttribute = "內部類別之類別屬性innerStaticAttribute";
  302. // inner classes cannot have static declarations
  303. private String innerInstanceAttribute = "內部類別之物件屬性innerInstanceAttribute";
  304.  
  305. public InMethodInstanceClass() {
  306. System.out.println(this.toString());
  307. }
  308.  
  309. public String toString() {
  310. String text = "";
  311.  
  312. text = text + "我是<方法內具名非靜態類別InMethodInstanceClass>物件,擁有\n";
  313. text = text + "\tx類別屬性\n";
  314. text = text + "\t物件屬性innerInstanceAttribute\n";
  315. text = text + "\tx類別方法\n";
  316. text = text + "\t物件方法innerInstanceMethod";
  317.  
  318. return text;
  319. }
  320.  
  321. //public static void innerStaticMethod()
  322. // inner classes cannot have static declarations
  323. /*
  324. {
  325. System.out.println( " 從類別方法innerStaticMethod,我可以:");
  326. System.out.println( " 存取 " + outerStaticAttribute);
  327. //System.out.println( " 存取 " + outerInstanceAttribute);
  328. // non-static variable cannot be referenced from a static context
  329. System.out.println( " 存取 " + innerStaticAttribute);
  330. //System.out.println( " 存取 " + innerInstanceAttribute);
  331. // non-static variable cannot be referenced from a static context
  332. outerStaticMethod();
  333. outerInstanceMethod();
  334. // non-static method cannot be referenced from a static context
  335. }
  336. */
  337.  
  338. public void innerInstanceMethod() {
  339. System.out.println(" 從物件方法innerInstanceMethod,我可以:");
  340. System.out.println(" 存取 " + outerStaticAttribute);
  341. System.out.println(" 存取 " + outerInstanceAttribute);
  342. //System.out.println( " 存取 " + innerStaticAttribute);
  343. // non-static variable cannot be referenced from a static context
  344. System.out.println(" 存取 " + innerInstanceAttribute);
  345. outerStaticMethod();
  346. outerInstanceMethod();
  347. // non-static method cannot be referenced from a static context
  348. }
  349. }
  350.  
  351. InMethodInstanceClass imic = new InMethodInstanceClass();
  352. //imic.innerStaticMethod();
  353. imic.innerInstanceMethod();
  354. }
  355.  
  356. public void outerInstanceMethod3() {
  357. InMethodUnnamedClass imuc = new InMethodUnnamedClass() {
  358. //private static String innerStaticAttribute3 = "內部類別之類別屬性innerStaticAttribute";
  359. // inner classes cannot have static declarations
  360. private String innerInstanceAttribute3 = "內部類別之物件屬性innerInstanceAttribute3";
  361.  
  362. public String toString() {
  363. String text = "";
  364.  
  365. text = text + "我是<方法內匿名非靜態類別 adapted from InMethodUnnamedClass>物件,擁有\n";
  366. text = text + "\t類別屬性innerStaticAttribute,2\n";
  367. text = text + "\t物件屬性innerInstanceAttribute,2,3\n";
  368. text = text + "\t類別方法innerStaticMethod\n";
  369. text = text + "\t物件方法innerInstanceMethod";
  370.  
  371. return text;
  372. }
  373.  
  374. //cannot overwrite constructor
  375. // invalid method declaration; return type required
  376. //public InMethodUnnamedClass()
  377. /*{
  378. System.out.println( "我是<方法內匿名非靜態類別>物件,擁有" );
  379. System.out.println( "\tx類別屬性" );
  380. System.out.println( "\t物件屬性innerInstanceAttribute" );
  381. System.out.println( "\tx類別方法" );
  382. System.out.println( "\t物件方法innerInstanceMethod" );
  383. }*/
  384.  
  385. //public static void innerStaticMethod()
  386. // inner classes cannot have static declarations
  387. /*
  388. {
  389. System.out.println( " 從類別方法innerStaticMethod,我可以:");
  390. System.out.println( " 存取 " + outerStaticAttribute);
  391. //System.out.println( " 存取 " + outerInstanceAttribute);
  392. // non-static variable cannot be referenced from a static context
  393. System.out.println( " 存取 " + innerStaticAttribute);
  394. //System.out.println( " 存取 " + innerInstanceAttribute);
  395. // non-static variable cannot be referenced from a static context
  396. outerStaticMethod();
  397. //outerInstanceMethod();
  398. // non-static method cannot be referenced from a static context
  399. }
  400. */
  401.  
  402. // overwriting method must exist in prototype class
  403. public void innerInstanceMethod() {
  404. System.out.println(" 從 覆寫的 物件方法innerInstanceMethod,我可以:");
  405. System.out.println(" 存取 " + outerStaticAttribute);
  406. System.out.println(" 存取 " + outerInstanceAttribute);
  407. //System.out.println( " 存取 舊有私密 " + innerStaticAttribute);
  408. // innerStaticAttribute has private access in InMethodUnnamedClass
  409. System.out.println(" 存取 舊有公開 " + innerStaticAttribute2);
  410. //System.out.println( " 存取 添加私密 " + innerStaticAttribute3);
  411. //System.out.println( " 存取 " + innerInstanceAttribute);
  412. // innerInstanceAttribute has private access in InMethodUnnamedClass
  413. System.out.println(" 存取 舊有公開 " + innerInstanceAttribute2);
  414. System.out.println(" 存取 添加私密 " + innerInstanceAttribute3);
  415. outerStaticMethod();
  416. outerInstanceMethod();
  417. // non-static method cannot be referenced from a static context
  418. }
  419. };
  420.  
  421. imuc.innerStaticMethod();
  422. imuc.innerInstanceMethod();
  423. }
  424.  
  425. // 類別內具名靜態類別
  426. public static class InClassStaticClass {
  427. private static String innerStaticAttribute = "內部類別之類別屬性innerStaticAttribute";
  428. private String innerInstanceAttribute = "內部類別之物件屬性innerInstanceAttribute";
  429.  
  430. public InClassStaticClass() {
  431. System.out.println("我是<類別內具名靜態類別InClassStaticClass>物件,擁有");
  432. System.out.println("\t類別屬性innerStaticAttribute");
  433. System.out.println("\t物件屬性innerInstanceAttribute");
  434. System.out.println("\t類別方法innerStaticMethod");
  435. System.out.println("\t物件方法innerInstanceMethod");
  436. }
  437.  
  438. public static void innerStaticMethod() {
  439. System.out.println(" 從類別方法innerStaticMethod,我可以:");
  440. System.out.println(" 存取 " + outerStaticAttribute);
  441. //System.out.println( " 存取 " + outerInstanceAttribute);
  442. // non-static variable cannot be referenced from a static context
  443. System.out.println(" 存取 " + innerStaticAttribute);
  444. //System.out.println( " 存取 " + innerInstanceAttribute);
  445. // non-static variable cannot be referenced from a static context
  446. outerStaticMethod();
  447. //outerInstanceMethod();
  448. // non-static method cannot be referenced from a static context
  449. }
  450.  
  451. public void innerInstanceMethod() {
  452. System.out.println(" 從物件方法innerInstanceMethod,我可以:");
  453. System.out.println(" 存取 " + outerStaticAttribute);
  454. //System.out.println( " 存取 " + outerInstanceAttribute);
  455. // non-static variable cannot be referenced from a static context
  456. System.out.println(" 存取 " + innerStaticAttribute);
  457. System.out.println(" 存取 " + innerInstanceAttribute);
  458. outerStaticMethod();
  459. //outerInstanceMethod();
  460. // non-static method cannot be referenced from a static context
  461. }
  462. }
  463.  
  464. // 類別內具名非靜態類別
  465. public class InClassInstanceClass {
  466. //private static String innerStaticAttribute = "內部類別之類別屬性";
  467. // inner classes cannot have static declarations
  468. private String innerInstanceAttribute = "內部類別之物件屬性innerInstanceAttribute";
  469.  
  470. public InClassInstanceClass() {
  471. System.out.println("我是<類別內具名非靜態類別InClassInstanceClass>物件,擁有");
  472. System.out.println("\tx類別屬性");
  473. System.out.println("\t物件屬性innerInstanceAttribute");
  474. System.out.println("\tx類別方法");
  475. System.out.println("\t物件方法innerInstanceMethod");
  476. }
  477.  
  478. //public static void innerStaticMethod()
  479. // inner classes cannot have static declarations
  480. /*
  481. {
  482. System.out.println( "從類別方法,我可以:");
  483. System.out.println( " 存取 " + outerStaticAttribute);
  484. //System.out.println( " 存取 " + outerInstanceAttribute);
  485. // non-static variable cannot be referenced from a static context
  486. //System.out.println( " 存取 " + innerStaticAttribute);
  487. System.out.println( " 存取 " + innerInstanceAttribute);
  488. outerStaticMethod();
  489. //outerInstanceMethod();
  490. // non-static method cannot be referenced from a static context
  491. }
  492. */
  493.  
  494. public void innerInstanceMethod() {
  495. System.out.println(" 從物件方法innerInstanceMethod,我可以:");
  496. System.out.println(" 存取 " + outerStaticAttribute);
  497. System.out.println(" 存取 " + outerInstanceAttribute);
  498. //System.out.println( " 存取 " + innerStaticAttribute);
  499. System.out.println(" 存取 " + innerInstanceAttribute);
  500. outerStaticMethod();
  501. outerInstanceMethod();
  502. }
  503. }
  504. }
  505.  
  506. class InMethodUnnamedClass {
  507. private static String innerStaticAttribute = "內部類別之類別屬性innerStaticAttribute";
  508. public static String innerStaticAttribute2 = "內部類別之類別屬性innerStaticAttribute2";
  509. // inner classes cannot have static declarations
  510. private String innerInstanceAttribute = "內部類別之物件屬性innerInstanceAttribute";
  511. public String innerInstanceAttribute2 = "內部類別之物件屬性innerInstanceAttribute2";
  512.  
  513. public InMethodUnnamedClass() {
  514. System.out.println(this.toString());
  515. }
  516.  
  517. public String toString() {
  518. String text = "";
  519.  
  520. text = text + "我是<方法內匿名類別InMethodUnnamedClass>物件,擁有\n";
  521. text = text + "\t類別屬性innerStaticAttribute,2\n";
  522. text = text + "\t物件屬性innerInstanceAttribute,2\n";
  523. text = text + "\t類別方法innerStaticMethod\n";
  524. text = text + "\t物件方法innerInstanceMethod";
  525.  
  526. return text;
  527. }
  528.  
  529. public static void innerStaticMethod() {
  530. System.out.println(" 從類別方法innerStaticMethod,我可以:");
  531. //System.out.println( " 存取 " + outerStaticAttribute);
  532. //System.out.println( " 存取 " + outerInstanceAttribute);
  533. // non-static variable cannot be referenced from a static context
  534. System.out.println(" 存取 私密 " + innerStaticAttribute);
  535. System.out.println(" 存取 公開 " + innerStaticAttribute2);
  536. //outerStaticMethod();
  537. //outerInstanceMethod();
  538. // non-static method cannot be referenced from a static context
  539. }
  540.  
  541. public void innerInstanceMethod() {
  542. System.out.println(" 從物件方法innerInstanceMethod,我可以:");
  543. //System.out.println( " 存取 " + outerStaticAttribute);
  544. //System.out.println( " 存取 " + outerInstanceAttribute);
  545. // non-static variable cannot be referenced from a static context
  546. System.out.println(" 存取 私密 " + innerStaticAttribute);
  547. System.out.println(" 存取 公開 " + innerStaticAttribute2);
  548. System.out.println(" 存取 私密 " + innerInstanceAttribute);
  549. System.out.println(" 存取 公開 " + innerInstanceAttribute2);
  550. //outerStaticMethod();
  551. //outerInstanceMethod();
  552. // non-static method cannot be referenced from a static context
  553. }
  554. }
  555.  
  556. public class Inner {
  557. public static void main(String args[]) {
  558. OuterClass oc = new OuterClass();
  559.  
  560. // 使用類別內具名靜態類別
  561. System.out.println("\n1.使用類別內具名靜態類別...");
  562. // 建立<類別內具名靜態類別>之物件
  563. OuterClass.InClassStaticClass oc_icsc = new OuterClass.InClassStaticClass();
  564.  
  565. OuterClass.InClassStaticClass.innerStaticMethod();
  566. oc_icsc.innerInstanceMethod();
  567.  
  568.  
  569. // 使用類別內具名非靜態類別
  570. // 要使用類別內具名靜態類別,需先建立其外部類別之物件
  571. System.out.println("\n2.使用類別內具名非靜態類別...");
  572. OuterClass.InClassInstanceClass oc_icic = oc.new InClassInstanceClass();
  573. //oc_icic.innerStaticMethod();
  574. oc_icic.innerInstanceMethod();
  575.  
  576. // 使用方法內具名類別
  577. System.out.println("\n3.使用類別方法內具名靜態類別...");
  578. OuterClass.outerStaticMethod2();
  579.  
  580. System.out.println("\n4.使用物件方法內具名非靜態類別...");
  581. oc.outerInstanceMethod2();
  582.  
  583. // 使用方法內具匿名類別
  584. System.out.println("\n5.使用類別方法內匿名靜態類別...");
  585. OuterClass.outerStaticMethod3();
  586.  
  587. System.out.println("\n6.使用物件方法內匿名非靜態類別...");
  588. oc.outerInstanceMethod3();
  589. }
  590. }

沒有留言: