首页 / JAVA / Java继承(方法覆盖和重载)
Java继承(方法覆盖和重载)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java继承(方法覆盖和重载),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2575字,纯文字阅读大概需要4分钟。
内容图文
![Java继承(方法覆盖和重载)](/upload/InfoBanner/zyjiaocheng/756/761eb288905940d7b13c0ac3aa0b725b.jpg)
除了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继承(方法覆盖和重载)全部内容,希望文章能够帮你解决Java继承(方法覆盖和重载)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。