java - name - private class中文




Java-不能訪問Foo類型的封閉實例 (4)

Thing是一個自動連接到Hello實例的內部類 。 你會得到一個編譯錯誤,因為它沒有實例來附加到它。 您可以通過將其更改為無連接的靜態嵌套類來輕鬆修復它:

static class Thing

我有以下代碼:

class Hello {
    class Thing {
        public int size;

        Thing() {
            size = 0;
        }
    }

    public static void main(String[] args) {
        Thing thing1 = new Thing();
        System.out.println("Hello, World!");
    }
}

我知道Thing什麼都不做,但是我的Hello,World程序編譯得很好,沒有它。 這只是我定義的類正在失敗。

它拒絕編譯。 我得到No enclosing instance of type Hello is accessible."在創建一個新的事物的線。我猜測:

  1. 我有系統級別的問題(DrJava或我的Java安裝)或
  2. 我對如何在java中構建工作程序有一些基本的誤解。

有任何想法嗎?


static class Thing將使您的程序工作。

事實上,你已經將Thing作為一個內部類,它(根據定義)與Hello一個特定實例(即使它從不使用或引用它)相關聯,這意味著說new Thing();是錯誤的。 new Thing(); 在範圍內沒有特定的Hello實例。

如果您將其聲明為靜態類,那麼它是一個“嵌套”類,它不需要特定的Hello實例。


讓我們用下面的簡單例子來理解它。 發生這種情況是因為這是非靜態的內部類。 你應該需要外部類的實例。

 public class PQ {

    public static void main(String[] args) {

        // create dog object here
        Dog dog = new PQ().new Dog();
        //OR
        PQ pq = new PQ();
        Dog dog1 = pq.new Dog();
    }

    abstract class Animal {
        abstract void checkup();
    }

    class Dog extends Animal {
        @Override
        void checkup() {
            System.out.println("Dog checkup");

        }
    }

    class Cat extends Animal {
        @Override
        void checkup() {
            System.out.println("Cat Checkup");

        }
    }
}

那麼...很多好的答案,但我想增加更多。 對Java中的Inner類的簡要介紹允許我們在另一個類中定義一個類,並且以這種方式嵌套類具有一定的優勢:

  1. 它可以隱藏(它增加了封裝)來自其他類的類 - 尤其是當類僅被它包含的類使用時相關。 在這種情況下,外界不需要知道它。

  2. 它可以使代碼更易於維護,因為這些類在邏輯上圍繞在需要的地方組合在一起。

  3. 內部類可以訪問其包含的類的實例變量和方法。

我們主要有三種類型的Inner Classes

  1. 本地內在
  2. 靜態內部類
  3. 匿名內部類

一些要記住的重要點

  • 我們需要類對象來訪問它存在的Local Inner Class。
  • 靜態內部類獲得直接訪問,就像它存在的同一類的任何其他靜態方法一樣。
  • 匿名內部類對於外部世界以及相同類(存在於其中)的其他方法或類都是不可見的,並且它在聲明它的點上使用。

讓我們嘗試實踐上述概念

public class MyInnerClass {

public static void main(String args[]) throws InterruptedException {
    // direct access to inner class method
    new MyInnerClass.StaticInnerClass().staticInnerClassMethod();

    // static inner class reference object
    StaticInnerClass staticInnerclass = new StaticInnerClass();
    staticInnerclass.staticInnerClassMethod();

    // access local inner class
    LocalInnerClass localInnerClass = new MyInnerClass().new LocalInnerClass();
    localInnerClass.localInnerClassMethod();

    /*
     * Pay attention to the opening curly braces and the fact that there's a
     * semicolon at the very end, once the anonymous class is created:
     */
    /*
     AnonymousClass anonymousClass = new AnonymousClass() {
         // your code goes here...

     };*/
 }

// static inner class
static class StaticInnerClass {
    public void staticInnerClassMethod() {
        System.out.println("Hay... from Static Inner class!");
    }
}

// local inner class
class LocalInnerClass {
    public void localInnerClassMethod() {
        System.out.println("Hay... from local Inner class!");
    }
 }

}

我希望這對每個人都有幫助。 請參閱更多





inner-classes