2016-04-07 5 views
1

Я класс А, класс В и класса С.Внутренний класс объекта от другого объекта

класс В представляет собой внутренний класс класса А. Как показано ниже:

public class A { 

     public class B { 
      String day; 
      HashMap<String, ArrayList<Date>> locationTimes; 
      public B() { 
       locationTimes = new HashMap<String, ArrayList<Date>>();} 
      } 

     **B fieldB;** 

    ..... 
    } 

Использование (может не иметь отношения к проблеме), я вставляю объект класса A в класс C.

Теперь я пытаюсь получить доступ к полям (String day, HashMap locationTimes) в классе B из другого объекта класса C. Но я не могу этого сделать.

Любая помощь приветствуется.

ответ

3

Вы должны создать экземпляр B, как:

public class A { 

    private B b; 

    public B getB() { 
    return b; 
    } 

    public static class B { 
     String day; 
     HashMap<String, ArrayList<Date>> locationTimes; 

     public B() { 
      locationTimes = new HashMap<String, ArrayList<Date>>(); 
      day = "Monday" 
     } 

     public String getDay() { 
     return day; 
     } 
    } 
} 

Тогда вы можете получить доступ к attrbutes из В, как этот:

public class C { 
    private A a; 

    public void doSomething() { 
     a.getB().getDay(); 
    } 
} 

Edit: Вам нужно свой класс B, чтобы быть либо private или public static.

+0

в моем классе C, если я делаю a.getB(). День говорит, что «день» не является общедоступным и к нему нельзя получить доступ из за пределами. Я пробовал сделать класс B как открытым, так и частным с тем же результатом. – runios

+1

, тогда вы должны писать публичные геттеры в своем классе B для атрибутов. – Dimi

+0

Я скоро обновлю свой ответ – Dimi

0

Да, вам нужно иметь экземпляр B где-то.

В вашем случае контейнер создает экземпляр, как:

public class C { 

@Inject 
A a; 

void someMethod() { 
    a.doit(); 
    A.B b = new A.B(); 
    b.doitToo(); // will work 
} 
} 
+0

Объект «a», который я вставляю в класс, является одноэлементным, и у него уже есть объект b, созданный ранее. Теперь я пытаюсь получить доступ к полям в объекте «b», но не смог. Он говорит, что поле не является общедоступным и к нему нельзя получить доступ извне. Я пробовал сделать класс B как открытым, так и частным с тем же результатом – runios

+1

Вам нужно иметь открытый геттер/сеттер в B! или сделать поля в B публичными, но это не считается хорошим стилем кодирования! Напишите метод в B, как public void setSomeField (Object someField) {this.someField = someField;} и напишите getter как public Object getSomeField() {return this.someField;}. Я приказываю получить доступ к экземпляру b из c, вам нужно иметь getter/setter в A для b. –

0

Я предполагаю, что вы не имеете экземпляр вашего внутреннего класса? В таком случае вы должны сделать это сами.

В внешнем классе вы можете создать новый экземпляр внутреннего класса

public class Outer { 
    Inner myInner; 

    public Outer(){ 
     myInner = new Inner(); 
    } 
} 

И если вам необходимо получить доступ к внутреннему классу непосредственно с внешней стороны, вы можете иметь метод получения для этого экземпляра.

Этот ответ отличается от того, что он изменил, изменив свой внутренний класс на вложенный статический класс, который отличается от исходного вопроса. (Кроме того, это неполный, а не предполагаемый способ использования статических вложенных классов)

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