多态的实现机制

多态是面向对象程序设计中代码重用的一个重要机制,它表示当同一个操作作用在不同对象时,会有不同的语义,从而产生不同的结果。在java语言中,多态主要有以下两种表现方式:
1.方法的重载(overload)。重载是指同一个类中有多个同名的方法,但这些方法有着不同的参数,因此在编译时就可以确定到底调用哪个方法,它是一种编译时多态。重载可以被看做一个类中的方法多态性。

2.方法的覆盖(override)。子类可以覆盖父类的方法,因此同样的方法会在父类与子类中有着不同的表现形式。在java语言中,基类的引用变量不仅可以指向基类的实例对象,也可以指向其子类的实例对象。同样,接口的引用变量也可以指向其实现类的实例对象。而程序调用的方法在运行期才动态绑定(绑定指的是将一个方法调用和一个方法主体连接到一起),就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。通过这张动态绑定的方法实现了多态。由于只有在运行时才能确定调用哪个方法,,因此通过方法覆盖实现的多态也可以称为运行时多态,示例如下:

public class Test{
    public static void main(String[] args){
        Base b = new Derived();
        b.f();
        b.g();
    }
}

class Base {
    public Base(){ 
        g(); 
    }
    public void f(){
        System.out.println("Base f()");
    }
    public void g(){
        System.out.println("Base g()");
    }
}

class Derived extends Base{
    public void f(){
        System.out.println("Derived f()");
    }
    public void g(){
        System.out.println("Derived g()");
    }
}

运行结果为:

Derived g()
Derived f()
Derived g()

在上例中,子类Derived的f()方法和g()方法会覆盖父类Base的f()方法和g()方法。在执行Base b = new Derived()语句时,对象b虽然被声明为Base,但是对象b的引用为Derived的一个实例化对象。即对象b存储在栈内存,对象b的引用存储在堆内存,其在栈内存中存储的值为堆内存的地址,访问对象b即访问一个实例化的Derived对象。Derived实例化时会默认调用父类Base的无参构造方法,此构造方法会调用子类的g()方法,而非父类的g()方法,因此会输出Derived g()。由于实际创建的是Derived类的对象,后面的方法调用都会调用子类Derived的方法。

你可能感兴趣的:(多态的实现机制)