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?
答案 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
方法,getRooms
和Rooms
中有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"。