2014-11-03 264 views
0

对于下面Ocean类,如何从派生类访问内部类构造函数?

public class Ocean { 

    /** 
    * Define any variables associated with an Ocean object here. These 
    * variables MUST be private. 
    */ 
    // width of an Ocean 
    private final int width; 
    // height of an Ocean 
    private final int height; 

    class Critter { 

     /** 
     * Defines a location of a Critter in an Ocean. 
     */ 
     Point location; 

     public Critter(int x, int y) { 
      location = new Point(x,y); 
     } 

     public Point getLocation() { 
      return location; 
     } 
    } 

    private Critter[][] oceanMatrix; 
} 

我想从下面类Shark构造访问构造Critter上面类。

class Shark extends Ocean implements Behaviour { 

    public Shark(int x, int y, int hungerLevel) { 
     super(x,y); 
    } 
} 

如何从Shark类的构造函数访问Critter类的构造函数?

+3

鲨鱼是海洋吗? – 2014-11-03 01:52:39

+0

@ChrisMartin +1我的意图是实际扩展Ocean.Critter,直到我看到下面的答案和内部类“Critter”的正确名称是'Position'时才知道。 – overexchange 2014-11-03 02:12:40

+1

“内部类的小人物的名字是位置”。我不认为这是。扩展一个类意味着一个“是”的关系。如果“阶级鲨鱼延伸位置”,这意味着鲨鱼“是一个”位置。但事实并非如此。它*有一个位置,所以你可以使用Position类作为Shark的一个字段,但是如果你想让Shark扩展某些东西,那么正确的类是Critter。 – Boann 2014-11-03 03:32:35

回答

6

似乎访问Critter像你应该扩展Critter代替海洋:

class Shark extends Ocean.Critter implements Behaviour{ 
... 
    public Shark(int x, int y, int hungerLevel){ 
     super(x,y); 

    } 
... 
} 

为此,Critter需要成为一个静态的内部类。我不知道这个设计有多少是属于你的,但是内部类应该限制在彼此强烈依赖的类中,这里不是这种情况。如果可以的话,把小怪物带出海洋。

+0

+1表示Critter不应该是内部类。看起来像作者可能会混淆内部类的类中的类包。 – 2014-11-03 02:03:59

+2

如果需要,如果Critter是一个非静态的内部类,使用名为[限定超类构造函数调用]的模糊语法,则可以使其工作(http://docs.oracle.com/javase/specs/jls/se8/ HTML/JLS-8.html#d5e14226)。例如,“鲨鱼类延伸到海洋。鲨鱼{鲨鱼(洋洋,int x,int y){ocean.super(x,y); }}。 – Boann 2014-11-03 02:07:14

+0

如果我将'Critter'类重命名为'Position',你认为继承内部类'Position'到'Shark'是否有意义。为什么人们会认为内部阶层应该只限于外部阶层? – overexchange 2014-11-03 02:10:34

3

只要Shark是在同一个包Ocean,并且添加了static修饰符Critter的类声明,你应该能够new Ocean.Critter()

+0

是的,将'Critter'声明为'Ocean'中的静态成员并且不需要在'Shark'中继承'Ocean.Critter'更有意义。但从语法的角度来看,如果我们继承'Ocean.Critter'到'Shark'类,那么我使用super(x,y)会出错,为什么? – overexchange 2014-11-03 02:00:57

相关问题