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