靜態方法中不能new內部類的實體對象


原因如下:

1.內部類可以訪問外部類的成員變量

2.對象創建完成后對象的成員變量才會被分配空間

3.main的靜態方法執行時可以不存在外部類,不創建實體對象

4.內部類能訪問成員變量意味着一定存在外部類實體對象

因為3和4矛盾,所以在靜態方法中不能new內部類的實體對象

 

解決辦法1:新建一個非靜態方法init(),在init()方法中new內部類的實體對象.然后在靜態方法main中新建一個外部類的實體對象去調用init()方法

示例代碼:

 1 /*
 2  * Test類本身就是外部類
 3  */
 4 public class Test {
 5     public static void main(String[] args) {
 6         new Test().init();//此處為新建的外部類的實體對象
 7     }
 8     //新建一個非靜態方法,在這個方法的內部new內部類的實體對象
 9     private void init(){
10         Outputer outputer = new Outputer();
11         new Thread(new Runnable(){
12             public void run() {
13                 while(true){
14                     try {
15                         Thread.sleep(10);
16                     } catch (InterruptedException e) {
17                         e.printStackTrace();
18                     }
19                     outputer.output("shen_smile");
20                 }
21             }
22         }).start();
23     }
24     //內部類
25     class Outputer{
26         public void output(String name){
27             int len = name.length();
28             for(int i=0;i<len;i++){
29                 System.out.print(name.charAt(i));
30             }
31             System.out.println();
32         }
33     }
34 }

 

解決辦法2:如果想直接在靜態方法中new內部類的實體對象,不想使用方法1,可以將內部類加static修飾,然后在new內部類時加final關鍵字修飾

示例代碼:

 1 /*
 2  * Test類本身就是外部類
 3  */
 4 public class Test {
 5     public static void main(String[] args) {
 6         final Outputer outputer = new Outputer();
 7         new Thread(new Runnable(){
 8             public void run() {
 9                 while(true){
10                     try {
11                         Thread.sleep(10);
12                     } catch (InterruptedException e) {
13                         e.printStackTrace();
14                     }
15                     outputer.output("shen_smile");
16                 }
17             }
18         }).start();
19     }
20     //內部類
21     static class Outputer{
22         public static void output(String name){
23             int len = name.length();
24             for(int i=0;i<len;i++){
25                 System.out.print(name.charAt(i));
26             }
27             System.out.println();
28         }
29     }
30 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM