Java内部类和扩展

Java内部类和扩展,java,oop,Java,Oop,我有一个教室和里面的教室,里面印着20张。 另一个名为BigHome的类扩展了Home及其内部类。 但是当我在主课堂上开始大家庭的时候。我得到的输出为20,我期望的输出为100 如何调用BigHome类的函数getRoom?BigHome没有BigHome.getHomeDetails;方法,因此它使用Home类中的方法,该类使用Home的房间。您可以为这两个类设置构造函数,然后在这些构造函数中设置要使用的房间类。比如: public class Home { public void

我有一个教室和里面的教室,里面印着20张。 另一个名为BigHome的类扩展了Home及其内部类。 但是当我在主课堂上开始大家庭的时候。我得到的输出为20,我期望的输出为100


如何调用BigHome类的函数getRoom?

BigHome没有BigHome.getHomeDetails;方法,因此它使用Home类中的方法,该类使用Home的房间。您可以为这两个类设置构造函数,然后在这些构造函数中设置要使用的房间类。比如:

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)
    }

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

另一种方法是覆盖BigHome类中的getHomeDetails方法,以设置BigHome正在使用的房间,这一方法完全脱离了继承的概念

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");
        }
    }
}

不过我不会就此提出建议。

BigHome没有BigHome.getHomeDetails;方法,因此它使用Home类中的方法,该类使用Home的房间。您可以为这两个类设置构造函数,然后在这些构造函数中设置要使用的房间类。比如:

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)
    }

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

另一种方法是覆盖BigHome类中的getHomeDetails方法,以设置BigHome正在使用的房间,这一方法完全脱离了继承的概念

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");
        }
    }
}

不过我不建议这样做。

您可以通过将新Rooms实例的构造移动到Home中的另一个方法中来实现,然后在BigHome中重写该方法,以返回新的内部实例:

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

您可以通过将新Rooms实例的构造移动到Home中的另一个方法中来实现这一点,然后在BigHome中重写该方法以返回新的内部实例:

public void getHomeDetails()
{
    Inner.Rooms r = new Inner.Rooms();
    r.getRooms();
}
将getHomeDetails方法定义为

在任何子类中都不会重写它。因此,在房间对象上调用getRooms的情况不会改变,因此它将始终打印20

BigHome包含的另一个类也实现了getRooms方法,这与此无关。这个新类也被称为Rooms并不意味着它是同一个类。调用getHomeDetails时,仅会实例化嵌套在Home中的第一个Room对象,并且会在此对象上调用GetRoom,而不会调用任何其他对象。

将方法getHomeDetails定义为

在任何子类中都不会重写它。因此,在房间对象上调用getRooms的情况不会改变,因此它将始终打印20

BigHome包含的另一个类也实现了getRooms方法,这与此无关。这个新类也被称为Rooms并不意味着它是同一个类。调用getHomeDetails时,仅会实例化嵌套在Home中的第一个Room对象,并在此对象上调用getRoom,而不会调用任何其他对象。

BigHome没有getRoom方法,Rooms和Inner中有getRooms

如果创建BigHome.Inner的实例并调用.getRooms,它将调用BigHome.Inner.getRooms。如果创建Home.Rooms实例并调用.getRooms,它将调用Home.Rooms.getRooms

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

尝试在内部重新编写getHomeDetails:

应该打印100而不是20。

BigHome没有getRoom方法,在Rooms和Inside中有getRooms

如果创建BigHome.Inner的实例并调用.getRooms,它将调用BigHome.Inner.getRooms。如果创建Home.Rooms实例并调用.getRooms,它将调用Home.Rooms.getRooms

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

尝试在内部重新编写getHomeDetails:


应该打印100而不是20。

我尽量不创建复杂的类继承结构。它们通常很快就成为真正的皮塔。类继承应该谨慎使用,并且只在真正必要的地方使用。我知道,这与大多数教科书相矛盾,但大多数关于面向对象的常识是完全错误的。我建议阅读E.Gamma等人关于设计模式的介绍性章节,以合理解释OO的原则以及为什么应该谨慎对待类继承。我尽量不创建复杂的类继承结构。它们通常很快就成为真正的皮塔。类继承应该谨慎使用,并且只在真正必要的地方使用。我知道,这与大多数教科书相矛盾,但大多数关于面向对象的常识是完全错误的。我建议阅读E.Gamma等人的设计模式介绍章节,以获得一个r 对OO原则的合理解释,以及为什么应该谨慎对待类继承。