Java继承 重载方法_Java继承(方法覆盖和重载)

除了Java继承是该语言的基本特征之外,我还有一些问题.

以下是我的测试示例的来源:

class MyClass{

public void say(String t){

System.out.println("Hello MyClass "+t);

}

public void print(MyClass t){

System.out.println("MyClass is printed");

}

public void anotherPrint(int i){

System.out.println("MyClass is printed again");

}

}

class MyClass2 extends MyClass{

public void say(String t){

System.out.println("Hello MyClass2 "+t);

}

public void print(MyClass2 t){

System.out.println("MyClass2 is printed");

}

public void anotherPrint(double i){

System.out.println("MyClass2 is printed again");

}

}

public class HelloWorld{

public static void main(String []args){

MyClass klass = new MyClass2();

klass.say("h"); //Question 1 (Prints: "Hello MyClass2 h")

klass.print(new MyClass2()); //Question 2 (Prints: "MyClass is printed")

klass.print(new MyClass()); //Question 3 (Prints: "MyClass is printed")

klass.anotherPrint(1); //Question 4 (Prints: "MyClass is printed again")

klass.anotherPrint(1.0); //Question 5 (Throws Exception!)

}

}

我有以下问题:

1. klass对象是MyClass的实例.为什么它从MyClass2类执行方法?

2,3.在问题1中,klass调用MyClass2类的方法.在这里,我使用了一个适合每个重写和重载(同时)方法的参数.为什么klass对象总是从MyClass类调用该方法?

这很正常.毫无疑问.

5.抛出异常是对的. klass对象没有带双参数的方法.但是,为什么它不是从MyClass2类调用的方法,就像在问题1中发生的那样?

解决方法:

1. klass对象是MyClass的实例.

不,它是MyClass类型的引用变量,但引用了MyClass2的对象.

2.为什么它从MyClass2类执行方法?

由于您在MyClass2的对象上调用say(),因此它执行MyClass2的say().预期的行为.

这在Java中称为运行时多态.这提供了覆盖类层次结构树中已有的功能的能力.在运行时,将调用哪个版本的方法是基于存储在该引用变量中的实际对象的类型,而不是基于引用变量的类型.

3.在问题1中,klass调用Class2类的方法.在这里,我使用了一个适合每个重写和重载(同时)方法的参数.为什么klass对象总是从MyClass类调用该方法?

这不是重写方法.具有相同签名(名称,加上其参数的数量和类型)的子类中的实例方法和作为超类中的实例方法的返回类型会覆盖超类的方法.重写方法也可以返回返回类型的子类型通过重写的方法.这称为协变返回类型.您的方法签名是不同的.因此,调用klass.print(),其中klass是MyClass引用,将始终引用MyClass的print().

4.抛出异常是对的. klass对象没有带双参数的方法.但是,为什么它不是从MyClass2类调用的方法,就像在问题1中发生的那样?

因为在编译时,编译器会验证您是否可以基于引用类型调用方法.这里的引用类型是MyClass,由于MyClass没有定义anotherPrint(double),编译器抱怨.它是一个编译时检查.在问题1中,编译器验证了klass.say(“hi”)并且它看到存在一个MyClass中的方法,可以这种方式调用.那时,它并不关心klass引用变量是否在运行时引用MyClass对象或MyClass2对象.因此它奏效了.

您可以参考这些Oracle的教程here.

标签:java,methods,inheritance,override

来源: https://codeday.me/bug/20190718/1493115.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值