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

原创 2016年05月30日 20:31:28

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以及构造器。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java中的多态(polymorphism)和动态绑定(dynamic binding)

以下面代码为例,存在超类Employee和子类Manager,两个类中都有getSalary方法,但实现不同。一个对象变量可以引用多种实际类型的现象被称为多态(polymorphism),运行时能够自...

Java中的重载、重写、多态,静态绑定、动态绑定

重载,英文名是overload,是指在一个类中定义了一个以上具有相同名称的方法,这些方法的参数个数、参数类型和顺序不能相同。返回类型可以相同,也可以不同。 public class Tstati...

C++ - 继承(inheritance) 和 动态绑定(dynamic binding) 简介

继承(inheritance) 和 动态绑定(dynamic binding) 简介   继承(inheritance)和动态绑定(dynamic binding) 是面向对象的重要组成部分, 即继承...

dynamic region binding task flow(region 动态绑定流taskflow)

以下是网上的问题,也是我遇到过的问题。In a page, I have several af:selectOneChoice components, below which is a dynam...

Java中的重载、重写、多态,静态绑定、动态绑定

重载,英文名是overload,是指在一个类中定义了一个以上具有相同名称的方法,这些方法的参数个数、参数类型和顺序不能相同。返回类型可以相同,也可以不同。 public class TstaticOv...

深入理解java——多态与动态绑定

此文章为我阅读《java核心技术I》的读书笔记。 穿插个人理解和书上所述。 以及引用了网上的文章。侵权删。1.多态首先,什么是多态?根据定义上来讲,一个对象变量可以指示多种实际类型的现象被称为多态...

(七)类、超类和子类 ——(多态,动态绑定,final类,类型转换,抽象类)

java中所有的继承都是公有继承。 在子类中的构造其内可以初始化超类的公有域,但不能初始化超类的私有域。 因此需要在子类构造前的第一行使用super()语句初始化超类的私有域。 如果超类没有不带...

Java中的多态与动态绑定

关于Java的多态在慕课网上的教程中已经学到了,但是当时似乎没有看到有动态绑定这么个主题。虽说,动态绑定的相关功能再教程中确实是提到了。        而Java中的多态一般是跟动态绑定放到一块儿说...

Java中的多态和动态绑定

先来一张图表明类Employee,Manager,Secretary,Programmer, Executive的继承关系 在java中有一个用来判断是否应该设计为继承关系的简...

java 多态 动态绑定

package com.bjpowernode.mybatis.test; public class TestMethod { public static void main(String[] ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Java Learning】重载、多态和动态绑定——Overloading、Ploymorphism&Dynamic binding
举报原因:
原因补充:

(最多只允许输入30个字)