2013-12-10 4 views
1

Итак, я наткнулся на стену раньше. Если у меня есть родительский класс с внутренним классом SubParent, как это:Вызов внутреннего класса родителя в супервызове Java

public class Parent 
{ 
    public class SubParent 
    { 
    } 

    public Parent(SubParent sp) 
    { 
    } 
} 

Тогда у меня есть класс ребенка, который проходит Родитель как это:

public class Child extends Parent 
{ 
    public Child() 
    { 
     super(new SubParent()); 
    } 
} 

Тогда я получаю «ошибка: не может ссылаться на этот прежде чем конструктор супертипа был вызван «со стрелкой, указывающей на конструктор SubParent.

Теперь, если у меня есть SubParent как отдельный класс в его собственном файле, все в порядке. Но я хотел бы иметь это как внутренний класс. Есть ли способ сделать это?

+0

Допустим, вы даже не расширяете свой класс «Родительский». Как вы создаете его экземпляр, например, в методе 'main'? – Pshemo

ответ

2

Внутренний экземпляр класса требует существования экземпляра внешнего класса. В момент вы вызываете

super(new SubParent()); 

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

Либо объявите SupParent в своем личном файле или сделайте это static. Какое отношение вы пытаетесь достичь в любом случае?

+0

Я просто играю с Java на этом этапе. На самом деле не было веской причины, чтобы класс SubParent был вложен иным, чем он использовался только в конструкторе класса Parent (а класс Child просто принял значение по умолчанию этого класса SubParent). – Clint7

1

Поскольку ваш SubParent не static вложенного класса, есть неявные отношения между ним и Parent объектом принадлежит (в этом случае, также Child объекта). Похоже, вам не нужны отношения, которые предоставляет внутренний класс; попробуйте сделать SubParent a public static class.

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

0

Ваша проблема заключается в том, что вы пытаетесь создать SubParent очень рано в построении Ребенка, прежде чем он будет готов использовать его как «это» во внутреннем создании класса. В дополнение к ранее предложений, вы можете изменить Parent иметь конструктор без параметров и сеттер для его SubParent справки:

public Parent(){ 

    } 

    public void setSub(SubParent sp){ 

    } 

Конструктор Ребенок не может ждать, пока после супер вызова, чтобы создать SubParent:

class Child extends Parent 
{ 
    public Child() 
    { 
     setSub(new SubParent()); 
    } 
} 
Смежные вопросы