多态的实现机制是什么?

版权声明:白小姐 https://blog.csdn.net/bailerong123/article/details/89977141


多态是面向对象程序设计中代码重用的一个重要机制,它表示当同一个操作在不同对象时,会有不同的语义,从而会产生不同的结果,例如:同样是执行“+”操作,“3+4”用来实现正数相加,而“3”+“4”却实现了字符串的连接。在java语言中,多态主要有以下两种表现方式:
1)方法的重载。重载是指同一个类中有多个同名的方法,但这些方法有着不同的参数,因此在编译时就可以确定到底调用哪个方法,它是一种编译时多态。重载可以被看作一个类中的方法多态性。
2)方法的覆盖。子类可以覆盖父类的方法,因此同样的方法会在父类与子类中有着不同的表现形式。在java语言中,基类的引用变量不仅可以指向基类的实例对象,也可以指向其子类的实例对象。同样,接口的引用变量也可以指向其实现的实例对象。而程序调用的运行方法在运行期间才动态绑定(绑定指的是将一个方法调用和一个方法主体连接到一起),就是引用变量所指向的具体实例对象的方法。通过这种动态绑定的方法实现了多态。由于只有在运行时才能确定调用哪个方法,因此通过方法覆盖实现的多态也可以被称为运行时多态,示范如下:

方法覆盖

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()");
    }
}
public class Test {
    public static void main(String[] args) {
        Base b=new Derived();
        b.f();
        b.g();
    }
}

程序运行结果为:

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

上例中,由于子类Derived的f()方法和g()方法与父类Base的方法同名,因此Derivered的方法覆盖Base的方法。在执行Base b=new Deriver()语句时,会调用Base类的构造函数,而在Base的构造函数中,执行了g()方法,由于Java语言的多态特性,此时会调用子类Derived的g()方法,而非父类Base的g()方法,因此会输出Deriver g()。由于实际上创建的是Deriver类的对象,后面的方法调用都会调用子类的Deriver的方法。
此外,只有类中的方法才有多态的概念,类中成员变量没有多态的概念,示例如下:

class Base1{
    public int i=1;
}
class Deriver1 extends Base1{
    public int i=2;
        }
public class Test1 {
    public static void main(String[] args) {
        Base1 b = new Deriver1();
        System.out.println(b.i);
    }
}

我们的运行结果是

1

由此可见,成员变量是无法实现多态的,成员变量的值取父类还是子类并不取决于创建对象的类型,而是取决于所定义变量的类型,这是在编译期间确定的。
在上述例子中,由于b所属的类型是Base,b.i指的是Base类中定义的i;因此程序输出结果为1.

常见笔试题

java中提供了哪两种用于多态的机制?
答案:编译时多态和运行时多态。编译时多态是通过方法重载实现的,运行时多态是通过方法的覆盖(子类覆盖父类方法)实现的。

猜你喜欢

转载自blog.csdn.net/bailerong123/article/details/89977141
今日推荐