2014-10-03 2 views
0

Не могли бы вы рассказать мне, почему приведенный ниже код не работает?Вложенные классы в java

public class NestedClassPrac { 
    public static class Nested { 
     public void sayHello() { System.out.println("First nested class~");} 
     public static class LittleNested { 
      public void sayHello() { System.out.println("this is why we are nested class");} 
     } 
    } 


    public static void main(String[] args) { 
     Nested a = new Nested(); 
     a.sayHello(); 
     LittleNested b = new LittleNested(); 
     b.sayHello(); 
    } 
} 

Ошибка сбщ:

NestedClassPrac.java:13: cannot find symbol 
symbol : class LittleNested 

location: class NestedClassPrac 
     LittleNested b = new LittleNested(); 
     ^

NestedClassPrac.java:13: cannot find symbol 

symbol : class LittleNested 

location: class NestedClassPrac 
     LittleNested b = new LittleNested(); 
          ^
2 errors 

ответ

2

LittleNested доступен только через Nested класса вы не можете получить доступ к нему напрямую, без использования Nested .ВЫХ могут получить доступ к внутреннему статическому классу же, как вы получите доступ к любому другому статическому члену класса (т.е., метод переменной).

Для примера

class X{ 
    static class Y{ 
     static class Z{ 
      Z(){ 
       System.out.println("Inside Z"); 
      } 
     } 
    } 
} 

вы можете создать Object из Z, как это в качестве внутренних классов статические.

X.Y.Z obj=new X.Y.Z(); 
3
 Nested.LittleNested b = new Nested.LittleNested(); 

Что именно вы пытаетесь сделать?

+0

wow, спасибо! Я понял. – shanwu

1

Ниже будет компилировать:

Nested.LittleNested b = new Nested.LittleNested(); 

или вы можете импортировать LittleNested

import <yourpackage>.NestedClassPrac.Nested.LittleNested; 

В принципе, у вас есть доступ внутрь main к чему-либо на том же уровне иерархии внутри NestedClassPrac без необходимости Импортировать. Это дает вам доступ к Nested. Однако LittleNested не находится на одном уровне иерархически; LittleNested есть внутри Nested. Поэтому вам нужен импорт.

0

вы должны получить доступ к следующим образом:

OuterClass.InnerClass1.InnerClass2...InnerClassN obj=new OuterClass.InnerClass1.InnerClass2...InnerClassN(); 
obj.method(); 
1

Ваш код не работает, так как от основного метода объема вам необходимо обратиться к LittleNested к югу от внутреннего класса, включая имя класса вшита:

public class NestedClassPrac { 
    public static class Nested { 
     public void sayHello() { System.out.println("First nested class~");} 
     public static class LittleNested { 
      public void sayHello() { System.out.println("this is why we are nested class");} 
     } 
    } 


    public static void main(String[] args) { 
     Nested a = new Nested(); 
     a.sayHello(); 
     Nested.LittleNested b = new Nested.LittleNested(); 
     b.sayHello(); 
    } 
} 

Из основного метода можно передать только класс Nested. Вы можете прочитать об этом на Nested Classes - Java Tutorial

Смежные вопросы