Java變異出現錯誤:No enclosing instance of type XXX is accessible

摘要:寫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);

    }

}

查詢資料,深入學習

參考網絡資料深入學習

靜態內部類和非靜態內部類之間到底有什麼不同呢?下面是兩者間主要的不同。

  • (1)內部靜態類不需要有指向外部類的引用。但非靜態內部類需要持有對外部類的引用。
  • (2)非靜態內部類能夠訪問外部類的靜態和非靜態成員。靜態類不能訪問外部類的非靜態成員。他只能訪問外部類的靜態成員。
  • (3)一個非靜態內部類不能脫離外部類實體被創建,一個非靜態內部類可以訪問外部類的數據和方法,因爲他就在外部類裏面

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章