Java内部类和扩展

时间:2014-04-20 13:34:13

标签: java oop

public class Home {

    public void getHomeDetails(){
        Rooms r = new Rooms();
        r.getRooms();
    }

    public class Rooms{
        public void getRooms(){
            System.out.println("20");
        }
    }
}



public class BigHome extends Home{

    public class Inner extends Home.Rooms{
        public void getRooms(){
            System.out.println("100");
        }
    }
}



public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        BigHome bigHome = new BigHome();
        bigHome.getHomeDetails(); // output:20 (Expecting 100)
    }

}

我有一个班级家庭及其内部课室,可打印20个。 另一个名为BigHome的类扩展了Home及其内部类。 但是当我在Main Class中启动BigHome时。我输出为20(我期望输出为100)

如何调用BigHome类的函数getRoom?

4 个答案:

答案 0 :(得分:4)

BigHome没有bigHome.getHomeDetails();方法,所以它使用Home类中使用home的房间的方法。您可以做的是为2个类设置构造函数,在这些构造函数中,然后设置要使用的Room类。喜欢:

public class Home
{
    Rooms r;

    public Home()
    {
        r = new Rooms();
    }

    public void getHomeDetails()
    {
        r.getRooms();
    }

    public class Rooms
    {

        public void getRooms()
        {
            System.out.println("20");
        }
    }
}

class BigHome extends Home
{
    public BigHome()
    {
        r = new Inner();
    }

    public class Inner extends Home.Rooms
    {

        public void getRooms()
        {
            System.out.println("100");
        }
    }
}

现在Home和BigHome都负责指定他们想要使用的房间。

另一种取决于整个继承概念的方法是覆盖BigHome类中的getHomeDetails方法,以设置BigHome正在使用的房间。

public void getHomeDetails()
{
    Inner.Rooms r = new Inner.Rooms();
    r.getRooms();
}

我不会就此提出建议。

答案 1 :(得分:1)

您可以通过将新Rooms实例的构建移动到Home中的另一个方法来执行此操作,然后在BigHome中覆盖该方法以返回新的Inner实例改为:

public class Home {
    public Rooms createRooms() {
        return new Rooms();
    }

    public void getHomeDetails(){
        Rooms r = createRooms();
        r.getRooms();
    }

    ...
}

public class BigHome extends Home{
    @Override
    public Rooms createRooms() {
        return new Inner();
    }

    ...
}

答案 2 :(得分:1)

您将方法getHomeDetails()定义为

public void getHomeDetails(){
    Rooms r = new Rooms();
    r.getRooms();
}

并且你永远不会在任何子类中重写它。因此,在getRooms()对象上调用Room时,它永远不会改变,因此它将始终打印20。

BigHome包含另一个也实现getRooms()方法的类是无关紧要的。这个新课程也被称为房间,并不意味着它是同一个班级。当您致电getHomeDetails()时,只会嵌套Room中嵌套的第一个Home对象,并且会在此对象上调用getRooms(),而不是其他任何对象。

答案 3 :(得分:1)

BigHome没有getRoom方法,getRoomsRooms中有Inner

如果您创建BigHome.Inner的实例并致电.getRooms(),则会调用BigHome.Inner.getRooms。如果您创建Home.Rooms的实例并致电.getRooms(),则会调用Home.Rooms.getRooms

您面临的问题是getHomeDetails是在父类Home中定义的,而不是在其他任何地方定义的。它创建了一个Home.Rooms的实例,因为这就是代码所要做的事情,因而就是20。

尝试在getHomeDetails中覆盖Inner

public void getHomeDetails(){
    Inner.Rooms r = new Inner.Rooms();
    r.getRooms();
}

那应该打印" 100"而不是" 20"。