[英]Method overriding in Java. Why is this program not calling the sub class method?
为什么该程序不调用子类方法? 它背后的概念是什么? 我对此完全感到困惑。 下面是代码。
超级班
public class TV {
public void checkType(TV b) {
System.out.println("Its a TV");
}
}
儿童班
public class LedTv extends TV {
public void checkType(LedTv b) {
System.out.println("Its a LED TV");
}
}
测试用例以获得结果
public class TestTV {
public static void main(String argss[]) {
TV a = new TV();
TV b = new LedTv();
a.checkType(a);
b.checkType(b);
}
}
两种checkType方法均可打印
Its a TV
Its a TV
具有相同签名的方法将在继承过程中被覆盖。 根据文档签名取决于:
在您的情况下,这些方法
public void checkType(TV b)
public void checkType(LedTv b)
显然有不同的签名,因为参数的类型不同。 您得到的称为方法重载
public class LedTv extends TV {
@Override //always put this here
public void checkType() {//no need for argument
System.out.println("Its a LED TV");
}
}
从上面的示例中可以看到,我添加了注释@Override。 尽管这不是必需的,但它会强制编译器进行检查并确保您实际上覆盖了某些内容。 如果不是,则会出现错误,这有助于解决错误。 我摆脱了传递给检查类型的参数的原因是因为它是多余的。 您可以始终使用this
关键字指向您当前位于其中的对象。
我意识到我忘了解释什么是重载和重载,所以我认为本示例将向您展示。
public class Main{
public static void main(String[] args){
new Main();
}
Main(){
new SuperClass().method();
new SuperClass().method(101010);
new Subclass().method();
new Subclass().method(595959);
}
class SuperClass{
SuperClass(){
System.out.println(this.getClass().getSimpleName());
}
public void method(){
System.out.println("method() from SuperClass -> Calling method(int x)");
method(0);
}
public void method(int x){
System.out.print("method() from SuperClass " + x + "\n\n");
}
}
class Subclass extends SuperClass{
@Override
public void method(int x){
System.out.print("method() from SubClass " + x + "\n\n");
}
}
}
产量
SuperClass
method() from SuperClass -> Calling method(int x)
method() from SuperClass 0
SuperClass
method() from SuperClass 101010
Subclass
method() from SuperClass -> Calling method(int x)
method() from SubClass 0
Subclass
method() from SubClass 595959
如您在SuperClass中所见, method()被int 重载为method(int x),而method()在Subclass中被重写 。 在输出中,您可以清楚地看到发生了什么。 重载方法与在Java中覆盖方法有什么区别?
覆盖方法的参数类型必须相同。 如果要覆盖子类中的方法,则它必须具有相同的参数,只有返回类型可以不同,但与超类方法中的层次结构相同
void checkType(TV)
是与void checkType(LedTv)
不同的函数原型。
因此,您没有在压倒一切 ,而是在超载 。
为了覆盖 ,函数名称和参数类型必须相同,并且返回类型相关 。 相关性的确切定义超出了此问题的范围。
您正在执行方法重载。 对于方法重写,父类和子类的方法签名都应该相同。 所以在子班上
public void checkType(LedTv b) {
System.out.println("Its a LED TV");
}
输入并检查-
public void checkType(TV b) {
System.out.println("Its a LED TV");
}
因为您的两个对象均为电视类型。
TV a = new TV();
TV b = new LedTV();
基本上是相同的对象基础类型。 在创建b
情况下,您要做的基本上就是告诉您也要具有子类功能的超类实例。 而且您正在重载方法,而不是覆盖它们。 您告诉程序参数是否为LedTV,将其打印出来,如果参数为TV,则将其打印出来。 您将if-else
逻辑简单地外包给了程序本身。 你要做的是
if(TV == TV) print TV
else if (TV == LedTV) print LedTV
但是问题在于代码中两个对象都是TV类型的,因此始终使用超类方法,并且第一个if为true,第二个甚至没有求值。
将b更改为此:
LedTv b = new LedTv();
b.checkType(b);
现在它可以正常工作,因为b
是LedTV
..类型的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.