我创建了一个非常简单的程序来测试当通过继承调用该方法时将调用哪个方法。
类 boo 扩展了 foo
。
使用 boo
对象,调用 foo
类 showMe
中的方法。 foo
类中的 showMe
方法调用 showText
方法在屏幕上显示文本。
boo
类重写 showText
方法并显示不同的文本。
我的预测是,foo
类中的方法将被调用,而不是 boo
类中的重写版本。我错了,调用了 boo
类中的方法。有人可以解释一下这是怎么发生的吗?另外,我想知道如何调用 foo
类中的方法,即使我在 boo
类中重写了方法。
嘘类
public class boo extends foo
{
public static void main(String[] args)
{
boo main = new boo();
main.showMe();
}
@Override
public void showText()
{
System.out.println("Bruhhh!!!");
}
}
foo 类
public class foo
{
protected void showMe()
{
showText();
}
public void showText()
{
System.out.println("Bruhhh Part 2!!!");
}
}
最佳答案
调用 boo 中的方法是因为 main
的类型为 boo
。
如果你想让它打印 foo
中的内容,你应该将 boo main = new boo();
更改为 foo main = new foo() ;
继承是一棵树。如果你尝试将它与现实生活中的树联系起来,比如进化、车辆、职业和相关分支,就会更容易理解。例如,工程师有很多种类型。起初有 Engineer
,然后是 ElectricalEngineer
,然后是 ComputerEngineer
。
public class Engineer {
public void do() {
System.out.println("I build stuff");
}
}
public class ElectricalEngineer {
public void do() {
System.out.println("I build electronics");
}
}
public class ComputerEngineer {
public void do() {
System.out.println("I build computers");
}
}
Engineer eng = new Engineer();
ElectricalEngineer ee = new ElectricalEngineer();
ComputerEngineer ce = new ComputerEngineer();
eng.do(); // prints "I build stuff"
ee.do(); // prints "I build electronics"
ce.do(); // prints "I build computers"
// eng is of type Engineer
// ee is of type ElectricalEngineer
// ce is of type ComputerEngineer
Engineer ee2 = new ElectricalEngineer();
Engineer ce2 = new ComputerEngineer();
ee2.do(); // prints "I build electronics"
ce2.do(); // prints "I build computers"
这里,看起来ee2
是Engineer
类型,但它实际上是ElectricalEngineer
。它将调用其重写的 do() 方法。与ce2
ElectricalEngineer ce3 = new ComputerEngineer();
ce3.do(); // prints "I build computers"
但如果你这样做:
ElectricalEngineer ee3 = new Engineer();
ComputerEngineer ce4 = new ElectricalEngineer();
ComputerEngineer ce5 = new Engineer();
您将在所有这些方面收到错误,因为 ElectricalEngineer
是一名工程师。 ComputerEngineer
是一个ElectricalEngineer
。 ComputerEngineer
也是一个工程师
。但并非所有工程师
都保证是ComputerEngineer
或ElectricalEngineer
。据您所知,他们可能是土木工程师
。
关于java - 使用继承的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33967146/