多态的概念
Java多态是指,一个对象可以表现出多种形态。具体来说,就是同一个方法可以根据不同的对象有不同的表现形式。这种表现形式分为两种:编译时多态和运行时多态。
编译时多态
编译时多态也称作静态绑定,指的是方法绑定在编译阶段。在编写代码时,编译器根据变量的类型确定它的方法,如果该方法不存在则编译期就会报错。在编译时多态中,方法的调用是静态绑定的,也就是说,方法重载会根据方法签名来判断调用哪个方法,而不是根据变量的实际类型来决定调用哪个方法。
看下面的代码:
//父类
public class Animal {
public void eat() {
System.out.println("I'm eating food.");
}
}
//子类
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("I'm eating fish.");
}
}
//测试类
public class Test {
public static void main(String[] args) {
Animal animal = new Cat();
animal.eat();
}
}
在这个例子中,编译时多态可以看出来。new Cat()创建一个Cat对象,但是animal变量的类型为Animal。在调用animal.eat()方法时,由于animal的类型是Animal,编译器会查找其在父类Animal中的eat()方法,然后调用Cat类中覆盖Animal类中的eat()方法,因此输出结果是“ I'm eating fish.”。
运行时多态
运行时多态也称作动态绑定,指的是方法绑定在运行阶段。在运行时多态中,方法的调用是动态绑定的,也就是说,它会根据变量的实际类型来决定调用哪个方法。在Java中,当利用子类对象调用方法时, JVM会先根据对象的类型找到相应的方法,然后再调用相应的方法。
看下面的代码:
//父类
public class Animal {
public void eat() {
System.out.println("I'm eating food.");
}
}
//子类
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("I'm eating fish.");
}
}
//测试类
public class Test {
public static void main(String[] args) {
Animal animal1 = new Animal();
Animal animal2 = new Cat();
Cat cat = new Cat();
animal1.eat();
animal2.eat();
cat.eat();
}
}
在这个例子中,运行时多态可以看出来。我们创建了一个Animal类和一个Cat类,其中Cat是Animal的子类。我们创建了一个animal1对象和一个animal2对象。animal1是Animal类的一个实例,它的类型和变量的类型是Animal。animal2是Cat的一个实例,它的类型是Animal,但是变量的类型是Cat。
animal1.eat();
由于animal1的类型是Animal,它会调用Animal类中的eat()方法。因此,输出结果是“I'm eating food.”
animal2.eat();
由于animal2的类型是Animal,但是它所引用的对象是Cat类型,因此JVM会调用Cat类中的eat()方法,输出结果是“I'm eating fish.”
cat.eat();
cat是Cat类的一个实例,因此会直接调用Cat类中的eat()方法,输出结果是“I'm eating fish.”
总结
Java的多态性使得代码更加灵活和可复用。编译时多态和运行时多态都是多态的两种表现形式。编译时多态是在编译时变量具有多个不同的类型,而运行时多态是实际上的方法在运行时被决定。在编写代码时,我们应该根据实际情况选择适当的多态表现形式。
本文来自投稿,不代表亲测学习网立场,如若转载,请注明出处:https://www.qince.net/javahaxjava.html
郑重声明:
本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。 若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
我们不承担任何技术及版权问题,且不对任何资源负法律责任。
如遇到资源无法下载,请点击这里失效报错。失效报错提交后记得查看你的留言信息,24小时之内反馈信息。
如有侵犯您的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!