2016-10-21 3 views
3

Ich habe eine Hauptklasse "m" und zwei innere Klassen genannt sub1, sub2, wo sub2 statische Klasse ist:Warum Java erlaubt nicht Instanz der inneren Klasse zu erstellen?

public class m 
{ 
    String n="n"; 
    static String s="s"; 
    public class sub1 
    { 
    public void fn(){System.out.println(n);} 
    //static public void fs(){System.out.println(s);} 
    } 
    static class sub2 
    { 
    //public void fn(){System.out.println(n);} 
    static public void fs(){System.out.println(s);} 
    } 
    public void f() 
    { 
    sub1 s1=new sub1();//OK, no error 
    sub2 s2=new sub2();//OK 
    } 

    public static void main(String[] args) 
    { 
    m obj=new m(); 
    sub1 s1=new sub1();//Error 
    s1.fn(); 
    //s1.fs(); 
    sub2 s2=new sub2();//OK 
    //s2.fn(); 
    s2.fs(); 
    } 
} 

ich es unter Linux mit OpenJDK zu kompilieren, es meldet Fehler

$ java -version 
openjdk version "1.8.0_91" 
OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~16.04.1-b14) 
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode) 

$ javac m.java 
m.java:24: Error: Cannot reference non-static variable this in a static context. 
    sub1 s1=new sub1();//Error 
      ^
1 Errors 

Das ist komisch für mich: 1. In mf() Member-Funktion können wir "sub1 s1 = new sub1();", aber in der Hauptsache können wir nicht 2. staic Klasse sub2 kann Instanz haben, während nicht Statische Sub1 kann nicht?

Ist dies ein Design von Java? Warum?

Antwort

7
  • Nicht statische innere Klassen werden als Elemente der äußeren Klasse behandelt.
  • Um ihre Instanzen zu erstellen, müssen Sie die Referenz der äußeren Klasse verwenden.

So haben Sie, so etwas zu tun,

OuterClass outer = new OuterClass(); 
InnerClass inner = outer.new InnerClass(); 

Also, in Ihrem Fall

m obj = new m(); 
sub1 s1 = obj.new Sub1(); 
+0

"Innere Klassen als Membervariablen der äußeren Klasse behandelt werden." Was bedeutet das? Innere Klassen sind keine Mitgliedsvariablen äußerer Klassen. Auf welche Weise werden sie als solche "behandelt"? –

+0

Vielleicht ein bisschen verwirrende Worte, die ich schrieb. Ich will damit sagen, dass sie als Mitglieder der äußeren Klasse agieren und daher auf sie mittels einer äußeren Klassenreferenz zugreifen müssen. Ich habe dies aus dem Buch kathie sierra für SCJP, 8. Kapitel über innere Klassen, studiert. –

+0

"Nicht statische innere Klassen werden als Mitglieder der äußeren Klasse behandelt." das stimmt, aber statische Member-Klassen sind * auch * Mitglieder der äußeren Klasse. JLS: "Eine Mitgliedsklasse ist eine Klasse, deren Deklaration direkt in einer anderen Deklaration einer Klasse oder einer Schnittstelle eingeschlossen ist." Das Besondere an inneren Klassen ist, dass sie eine umschließende Instanz haben. –

Verwandte Themen