Java的重写重载与多态

Mon May 04 00:22:20 CST 2015 1205 Java

文章摘要Java是面向对象的编程语言。面向对象的几个重要特征是封装、继承和多态。多态是怎么实现的呢?是通过重写和重载来实现的吗?

先来看看一段Java代码

class Father{
    public void method(){}
}

class Child1 extends Father{
    @Override
    public void method(){}
    
    public void method(int i){}
}

class Child2 extends Father{
    @Override
    public void method(){}
    
    public void method(char c){}
}

上面的Java代码有三个类Father类、Child1类和Child2类,其中Child1类和Child2类都继承了Father类,并重写了method()方法,此外还对method进行了重载(method(int i)和method(char c))。

再看下面一段Java代码

public class Main{
    public static void main(String[] args){
        Father c1 = new Child1();
        Father c2 = new Child2();
        c1.method();
        c2.method();
        //c1.method(0);    //这样是会报错的,因为父类没有定义参数列表为int的method方法
        //c2.method('a');  //这样是会报错的,因为父类没有定义参数列表为char的method方法
    } 
}

在main方法里,面向父类Father创建了两个子类对象,然后分别调用两个对象的method()方法,这时虚拟机会调用相应子类Child1或者Child2对象的method()方法,这就是通过重写来实现多态。这种多态是动态实现的,在编译期,编译器是不知道代码会怎么调用。


那么我们看看重载是怎么一回事。再看下面一段Java代码

public class Main{
    public static void main(String[] args){
        Child1 c1 = new Child1();
        c1.method();
        c1.method(0);
    } 
}

显然,上面这段代码也可以通过调用同一个方法名称来进行两种不同的行为,只是参数列表不同了。方法的重载静态的,编译器在编译期间就知道代码会如何调用了。业内也有人把方法的重载也作为多态的一种实现。但是方法重载在面向对象问世之前就存在了,重载并不依赖于类与类继承关系(或者接口的实现),也可以在不支持面向对象语言中实现。这点也是学术界里的争论较多的地方。

打赏
打赏

分享到: