网站首页 > java教程 正文
Java 中的虚拟方法调用和运行时多态是面向对象编程的重要特性。
虚拟方法调用是指在运行时根据对象的实际类型来确定要调用的方法。在 Java 中,通过覆盖/重写(Override)父类的方法来实现虚拟方法调用。
简单的示例
abstract class Animal {
private String type;
private String name; // Name
private String breed; // breed
public Animal(String aType) {
type = new String(aType);
}
public Animal() {
this( "Some Type of Animal " );
}
public String getType() {
return type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setBreed(String breed) {
this.breed = breed;
}
/*
public void sound() {
System.out.println("Animal sound!");
}
*/
public abstract void sound();
}
class Dog extends Animal {
public Dog(String aName, String aBreed) {
super("Dog");// Call the super constructor
setName(aName); // Supplied name
setBreed(aBreed); // Supplied breed
}
public void sound() {
System.out.println(getType() + " " +
getName() + " WangWang!");
}
}
class Duck extends Animal {
public Duck(String aName, String aBreed) {
this(); // Call the base constructor
setName(aName); // Supplied name
setBreed(aBreed); // Supplied breed
}
public Duck() {
super("Duck");
}
public void layEggs() {
System.out.println("Egg laid!");
}
public void sound() {
System.out.println(getType() + " " +
getName() + " Quack quack!");
}
}
class Cat extends Animal {
public Cat(String aName, String aBreed) {
super("Cat"); // Call the base constructor
setName(aName); // Supplied name
setBreed(aBreed); // Supplied breed
}
public void catchMice() {
System.out.println("Mouse catched!");
}
public void sound() {
System.out.println(getType() + " " +
getName() + " MiuMiu!");
}
}
public class TestAnimalsSound {
public static void main(String[] args) {
//Heterogeneous Collection
Animal[] theAnimals = {
new Dog("Gooffy", "Poodle"),
new Duck("Docnald", "Disney"),
new Cat("Jaffy", "White")
};
for (Animal a : theAnimals) {
// Output the class name: Cat/Dog/Duck
System.out.println("\n" + a.getClass());
//sound
a.sound();
//Lay eggs or Catch mice
if (a instanceof Duck) ((Duck)a).layEggs();
if (a instanceof Cat) ((Cat)a).catchMice();
}
}
}
这个程序的输出结果如下:
class Dog
Dog Gooffy WangWang!
class Duck
Duck Docnald Quack quack!
Egg laid!
class Cat
Cat Jaffy MiuMiu!
Mouse catched!
在这个示例中:
1. Animal 是一个抽象的基类,包含一个抽象的sound() 方法,也就是这里所说的虚拟方法。
2. Dog 、Duck 和 Cat 是 Animal 的子类,它们分别覆盖/重写了 sound() 方法。
3. 在 main 方法中,创建了一个 Animal类型的数组对象,并将数组元素分别初始化赋为 Dog 、Duck 和 Cat 三个对象。
4. 使用For-each循环,依次取出Animal数组元素,调用 a.sound() 时,由于调用的是Animal中定义的虚拟方法,实际会根据对象的实际类型(在这里是 Dog、Duck 和 Cat )来确定要执行的具体方法。
使用多态的优点
通过虚拟方法调用和运行时多态,使得不同类型的对象可以具有不同的行为。
1. 灵活性:可以根据具体的对象类型执行不同的操作。
2. 可扩展性:方便地添加新的子类并提供独特的行为。
3. 代码重用:父类的方法可以在子类中重用,并根据需要进行定制。
猜你喜欢
- 2024-09-25 树莓派运行和编译Java程序,详细步骤安装JDK
- 2024-09-25 1.3java的运行原理(java安全设置已阻止自签名的应用程序运行)
- 2024-09-25 深入浅出:图形化浅析JAVA程序运行模式及虚拟机JVM
- 2024-09-25 Java编译的运行机制—程序是如何执行起来的?
- 2024-09-25 Java文件是如何运行和工作(java怎么运行的)
- 2024-09-25 JVM学习第二篇思考:一个Java代码是怎么运行起来的-下篇
- 2024-09-25 Java,JNA框架,运行期间动态调用系统本地库,动态调用DLL案例
- 2024-09-25 要让java代码运行起来,不能再简单做法了,人人都会
- 2024-09-25 java 性能优化:35 个小细节,让你提升 java 代码的运行效率
- 2024-09-25 java命令行编译及运行程序全过程(命令行编译java文件)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)