一、多态
1、什么是多态
多态(Polymorphism)是面向对象编程的三大核心特性之一(另外两个是封装和继承)。多态性允许一个接口或基类的不同实现或子类以统一的方式处理。
二、方法多态
方法的多态性主要通过方法重载(Overload)和方法重写(Override)来实现。
1、方法重载实现方法多态
package com.pack1;
public class Test {
public static void main(String[] args) {
Cal cal = new Cal();
System.out.println(cal.sum(1, 2));
System.out.println(cal.sum(1.1, 2.2));
}
}
class Cal {
public int sum(int n1, int n2) {
return n1 + n2;
}
public double sum(double n1, double n2) {
return n1 + n2;
}
}
运行结果:
这个例子中我们使用了方法重载来实现 sum 这个方法的多态,对方法 sum 传入不同的参数,可以看调用不同的 sum 函数,这就是多态的一种体现。
2、方法重写实现方法多态
package com.pack1;
public class Test {
public static void main(String[] args) {
Animal animal = new Animal();
animal.makeSound();
Dog dog = new Dog();
dog.makeSound();
}
}
class Animal {
public void makeSound() {
System.out.println("Animal make sound...");
}
}
class Dog extends Animal {
public void makeSound() {
System.out.println("woof...");
}
}
运行结果:
这一个例子就是通过方法重写实现多态,当我们对不同对象使用 makeSound 方法时,调用的 makeSound 方法也是不同的,这里方法重写也能体现多态。
三、对象多态
1、编译时类型和运行时类型
对象的多态主要体现在是编译时类型和运行时类型。编译时类型是声明对象引用变量时使用的类型,也就是引用变量的类型,运行时类型是实际创建的对象的类型,也就是实际指向的对象的类型。
例如下面的一段代码:
package com.pack1;
public class Test {
public static void main(String[] args) {
Animal animal = new Dog();
}
}
class Animal {
}
class Dog extends Animal {
}
这段代码中 Dog 为 Animal 类的子类,然后我们声明的一个 Animal 类的对象引用变量 animal ,然后创建一个 Dog 类的对象,将这个 Dog 类的对象的引用赋值给这个 Animal 类的对象引用变量 animal 。
这里的 animal 的编译时类型就是 Animal ,运行时类型就是 Dog 。
从这个例子中,我们可以总结出一些结论:
- 编译时类型在声明对象引用变量时就确定了,不能改变;而运行类型是可以改变的。
- 编译时类型看声明时的 “=” 左边,运行时类型看 “=” 右边。
2、向上转型(Upcasting)
上面的例子中我们可以看到我们使用一个 Animal 类的对象引用变量存储了一个 Dog 类的对象的引用,也就是使用一个父类引用变量指向了一个子类对象,实际上这个就是向上转型的本质。
所以说,向上转型(Upcasting)是指将子类对象的引用转换为父类类型的引用。在Java中,这是一个隐式的类型转换,因为子类对象本身就具备父类的所有特性和行为。因此,我们可以直接将子类对象赋值给父类引用,而不需要显式的类型转换。
向上转型的语法:
Parent parentRefe = new Child();
在这个例子中,Child
是&nb