Java多态中的就近原则介绍
Java中的多态性有三种表现形式:方法重载、方法重写和对象引用的多态性。其中,对象引用的多态性就是实现延迟绑定的方式,它可以让我们在程序运行时根据实际对象类型来确定调用哪个方法。
在多态场景下,就近原则是作用于对象引用调用方法时的参数列表类型的选择(即决定使用哪个方法),它和方法重载得到相同条件下的参数匹配的方式相同。当Java编译器在遇到一个方法调用时,有多个方法可以作为候选时,就近原则规定,编译器使用参数类型与方法参数类型最接近的那个方法。
举例说明:
假设我们有一个父类Animal
,子类Cat
继承了父类。父类中定义了一个show()方法接收参数为Animal
类型,子类重写了show()方法并接收参数为Cat
类型。
class Animal {
public void show(Animal animal) {
System.out.println("Animal show");
}
}
class Cat extends Animal {
@Override
public void show(Animal animal) {
System.out.println("Cat show");
}
public void show(Cat cat) {
System.out.println("Cat show, Cat parameter");
}
}
public class Test {
public static void main(String[] args) {
Animal cat = new Cat();
Cat cat1 = new Cat();
cat.show(cat1);
}
}
上述代码中,我们创建了一个Animal
类型的变量cat,并用它指向了一个Cat
类的实例。在调用cat.show(cat1)
时,会出现多个同名的show方法可供调用,参数列表分别为(Animal)
和(Cat)
。由于参数类型Cat
更加接近方法中的参数类型,所以选择就近规则,在此情况下,会选择(Cat)
类型的方法,输出结果为Cat show, Cat parameter
。
再举例说明:
假设我们定义两个接口InterfaceA
、InterfaceB
,类Test
实现了两个接口,并分别实现了接口方法showA()
和showB()
。
interface InterfaceA {
public void show();
}
interface InterfaceB {
public void show();
}
class Test implements InterfaceA, InterfaceB {
public void show() {
System.out.println("Test");
}
public static void main(String[] args) {
Test test = new Test();
InterfaceA ia = test;
InterfaceB ib = test;
ia.show();
ib.show();
}
}
在代码中,我们创建了一个Test
类型的实例test并将其赋值给类型为InterfaceA
和InterfaceB
的两个变量。分别调用ia.show()
和ib.show()
时,输出结果均为Test
。由于Java中的接口只能定义未实现的方法,因此编译器需要根据参数类型来确定使用哪个实现,这里就近规则依然适用,选择输出Test
。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java多态中的就近原则介绍 - Python技术站