Java多态理解
java中的多态性是面向对象编程的精髓所在。多态性是指父类引用指向子类对象,例如父类Animal,子类Cat和Dog。其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类。Animal animal = new Cat();即声明的是父类,实际指向的是子类的一个对象。
多态性的优点是什么?为什么要这么用?可以用这几个关键词来概括:多态、动态链接、向上转型。向上转型是指父类类型的引用指向子类对象。这种方法可以降低程序的耦合性,即调用者不必关心调用的是哪个对象,只需要针对接口编程就可以了,被调用者对于调用者是完全透明的。让你更关注父类能做什么,而不去关心子类是具体怎么做的,你可以随时替换一个子类,也就是随时替换一个具体实现,而不用修改其他。
在java中,多态性是通过方法的重写和重载来实现的。方法的重写是指子类对父类方法的重写,方法的重载是指一个类中有多个同名的方法,但参数列表不同。Java引入了多态性的概念是为了弥补单继承的不足。抽象类和接口也是解决单继承规定限制的重要手段。
理解多态首先要知道“向上转型”。我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过Cat c = new Cat();实例化一个Cat的对象,这个不难理解。但当我这样定义时:Animal a = new Cat();这代表什么意思呢?很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。这就是“向上转型”。
那么什么是动态链接呢?当父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。
下面看一下典型的多态例子:
```java
class Father{
public void func1(){
func2();
}
public void func2(){
System.out.println("AAA");
}
}
class Child extends Father{
public void func1(int i){
System.out.println("BBB");
}
public void func2(){
System.out.println("CCC");
}
}
public class PolymorphismTest {
public static void main(String[] args) {
Father child = new Child();
child.func1(); // 输出 CCC
}
}
```
在上面的例子中,Father是父类,Child是子类。Child继承了Father,并重写了Father中的func2()方法。在main方法中,我们定义了一个Father类型的引用child,并将其指向了新的Child对象。然后,我们调用了child.func1()方法,这将输出CCC。这是因为child.func1()方法将会调用Child中的func2()方法,而不是Father中的func2()方法。这就是动态连接。
java中的多态性是通过向上转型和动态链接来实现的。多态性可以降低程序的耦合性,提高程序的灵活性和可维护性。