摘要:寫java代碼時遇到下面的編譯錯誤。
本文分享自華爲雲社區《Java中出現No enclosing instance of type XXX is accessible問題》,作者:zhushy 。
錯誤代碼和錯誤現象
先記錄下問題現象,寫java代碼時遇到下面的編譯錯誤。
No enclosing instance of type FileTree is accessible. Must qualify the allocation with an enclosing instance of type FileTree (e.g. x.new A() where x is an instance of FileTree).
代碼如下:
import java.util.Arrays; import java.util.LinkedHashMap; public class FileTree { class Node { String name; public Node(String name) { super(); this.name = name; } LinkedHashMap<String, Node> map = new LinkedHashMap<String, Node>(); } public static void outputThreeFormat(String[] in) { Arrays.sort(in); Node root = new Node("/"); } public static void main(String[] args) { String[] in = { "usr/local/lib64", "GAMES", "usr/DRIVERS", "home", "var/log/" }; outputThreeFormat(in); } }
錯誤截圖如下:
如何解決這些錯誤
錯誤的含義是,沒有可以訪問的外部實例enclosing instance。必須分配一個合適的外部類FileTree的實例(如x.new A(),x必須是FileTree的實例。)
結合出錯的代碼,很容易知道根源是什麼:
- class Node是非靜態內部類
- 而public static void outputThreeFormat(String[] in)是靜態方法
- 靜態方法是不能直接訪問非靜態類的。
可以不使用內部類
可以把class Node作爲外部類定義,這樣在FileTree類中不管是靜態還是非靜態方法都可以直接new Node初始化個節點。
import java.util.Arrays; import java.util.LinkedHashMap; class Node { String name; public Node(String name) { super(); this.name = name; } LinkedHashMap<String, Node> map = new LinkedHashMap<String, Node>(); } public class FileTree { public static void outputThreeFormat(String[] in) { Arrays.sort(in); Node root = new Node("/"); } public static void main(String[] args) { String[] in = { "usr/local/lib64", "GAMES", "usr/DRIVERS", "home", "var/log/" }; outputThreeFormat(in); } }
可以使用靜態內部類
可以把class Node作爲靜態內部類定義,即static class Node。
import java.util.Arrays; import java.util.LinkedHashMap; public class FileTree { static class Node { String name; public Node(String name) { super(); this.name = name; } LinkedHashMap<String, Node> map = new LinkedHashMap<String, Node>(); } public static void outputThreeFormat(String[] in) { Arrays.sort(in); Node root = new Node("/"); } public static void main(String[] args) { String[] in = { "usr/local/lib64", "GAMES", "usr/DRIVERS", "home", "var/log/" }; outputThreeFormat(in); } }
使用非靜態內部類時,使用外部類的實例進行調用
如下所示。
import java.util.Arrays; import java.util.LinkedHashMap; public class FileTree { class Node { String name; public Node(String name) { super(); this.name = name; } LinkedHashMap<String, Node> map = new LinkedHashMap<String, Node>(); } public static void outputThreeFormat(String[] in) { Arrays.sort(in); FileTree ft=new FileTree(); Node root = ft.new Node("/"); } public static void main(String[] args) { String[] in = { "usr/local/lib64", "GAMES", "usr/DRIVERS", "home", "var/log/" }; outputThreeFormat(in); } }
查詢資料,深入學習
參考網絡資料深入學習
- https://www.cnblogs.com/kungfupanda/p/7239414.html java中的Static class
靜態內部類和非靜態內部類之間到底有什麼不同呢?下面是兩者間主要的不同。
- (1)內部靜態類不需要有指向外部類的引用。但非靜態內部類需要持有對外部類的引用。
- (2)非靜態內部類能夠訪問外部類的靜態和非靜態成員。靜態類不能訪問外部類的非靜態成員。他只能訪問外部類的靜態成員。
- (3)一個非靜態內部類不能脫離外部類實體被創建,一個非靜態內部類可以訪問外部類的數據和方法,因爲他就在外部類裏面