【Java Learning】重载、多态和动态绑定——Overloading、Ploymorphism&Dynamic binding

来源:互联网 发布:聚游网络散人 编辑:程序博客网 时间:2024/06/16 12:13

Title:重载、多态和动态绑定——OverloadingPloymorphism&Dynamic binding


【Section one】

    对于面向对象编程语言,重载、多态和动态绑定是非常重要的概念,并且其中细节容易误解,在此,我写下这篇文章既为总结,亦为学习。

【Section two】

一、重载

   在Java中,方法的名称和形参列表称为方法的签名,只要签名相同便视为同一方法,因此,在同一个类中不允许出现签名相同的方法,如:public int getSalary()与public double getSalary()在同一个类中定义便会报错,因为按照Java的语法规则,这两个方法的签名是相同的,则视为重复定义!!

   所谓重载,指的是方法的名字相同而形参列表不同(即签名不同),如:public void setSalary(double s)与public void setSalary(int s)就是两个不同的方法,当对象调用名为setSalary的方法时,编译器会查看调用这个方法时提供的参数类型,如果在所有名为setSalary的方法中存在于提供参数类型完全匹配的方法,则编译器自动选择这个方法。如下例子,编译会根据调用add方法时提供的参数类型自动寻找完全匹配的方法。

public double add(double num1,double num2){return num1+num2;}public int add(int num1,int num2){return num1+num2;}System.out.println(boss.add(100, 200));System.out.println(boss.add(100.1, 200.0));
输出结果:

     300
     300.1

二、多态

    多态的定义:一个对象变量可以指示多种实际类型的现象。在Java中,对象变量是多态的,一个类Temp的对象变量既能引用Temp类的对象,也能引用Temp类的任意子类的对象。虽然如此,但是超类对象变量引用其子类对象的时候需要注意几个问题:(我们以Employee类和Manager类为例,其中Employee为Manager的超类,如下程序,p为超类对象变量,boss为子类对象变量,p=boss,使得p引用了其子类对象)

    1、引用子类对象的超类对象变量不能调用子类中新定义的方法(即超类中不存在同样签名的方法);

    2、引用子类对象的超类对象变量可以调用子类未定义而定义于超类中的方法(显然,因为这是继承而来的);

    3、若子类中定义了与超类签名相同的方法,子类中的该方法将覆盖超类中的方法,即:引用子类对象的超类对象变量调用子类和超类中均有定义且签名相同的方法时,将调用子类中的该方法。

public class Test {public static void main(String[] args) {Employee p=new Employee("Calvin",44,32345.9);Manager boss=new Manager("Sue",23,3000,2000);p=boss;//超类对象变量引用子类对象p.setSalary(2000);//调用超类Employee中的getSalary()方法(第二条)p.getSuperSalary();//将报错,P[0]无法调用只存在于子类中的方法(第一条)System.out.println(p.getSalary());//调用的是子类中的getSalary方法(第三条)}}class Employee{private String name;private int age;private double salary;public Employee(String aname,int aage,double asalary){name=aname;age=aage;salary=asalary;}public double getSalary(){return salary;}public void setSalary(double salary){this.salary=salary;}}class Manager extends Employee{private double bonus;public Manager(String name,int age, double salary,double bonus){super(name,age,salary);this.bonus=bonus;}public double getSalary(){return super.getSalary()+bonus;}public double getSuperSalary(){return super.getSalary();}}

三、动态绑定

    在Java中的定义:在运行时能够自动选择调用哪个方法的现象称为动态绑定。一个对象调用一个方法时,编译器会首先查看对象声明的类型和所调用的方法的名,需要注意的是,在该对象所属的类及其超类中可能存在多个方法具有相同的名字,编译器会列举所有可调用的方法作为候选;然后根据调用方法所提供的参数类型进一步从这些候选方法中寻找完全匹配的方法,这一步也就是重载;到此,完全匹配的方法并不一定是唯一的,因为该对象所属的类及其超类中可能定义了相同签名的方法,这时候就有一个“覆盖”的问题,即:子类中的这个签名的方法将会覆盖掉其超类中相同签名的方法;最后,该对象才能确定调用的是哪个方法。这个过程称为动态绑定,说得直白点,对象调用某个方法时,编译器是不能直接确定的,而是一个动态判定的过程。


【Section three】

    补充:与动态绑定相对应,还有一种静态绑定(Static Binding),也就是编译器可以准确的知道调用的方法,这类方法包括private、final、static以及构造器。

1 0
原创粉丝点击