繁体   English   中英

Java中的方法重写。 为什么该程序不调用子类方法?

[英]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

具有相同签名的方法将在继承过程中被覆盖。 根据文档签名取决于:

  1. 方法名称
  2. 参数的数量
  3. 参数的类型

在您的情况下,这些方法

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

现在它可以正常工作,因为bLedTV ..类型的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM