多态和重载的区别
月下亭吧
全部回复
仅看楼主
level 11
2008常青树 楼主
多态是基于对抽象方法的覆盖来实现的,用统一的对外接口来完成不同的功能。重载也是用统一的对外接口
来完成不同的功能。那么两者有什么区别呢?
重载,是指允许存在多个同名方法,而这些方法的参数不同。重载的实现是:编译器根据方法不同的参数表
,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的调用地址在编译期
就绑定了。
多态:是指子类重新定义父类的虚方法(virtual,abstract)。当子类重新定义了父类的虚方法后,父类根据
赋给它的不同的子类,动态调用属于子类的该方法,这样的方法调用在编译期间是无法确定的。
不难看出,两者的区别在于编译器何时去寻找所要调用的具体方法,对于重载而言,在方法调用之前,编译
器就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”;而对于多态,只有等到方法调用的那一刻
,编译器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”。
2016年04月24日 23点04分 1
level 11
2008常青树 楼主
/* 劳动者 */
class Worker
{
public int age = 30;
public void work()
{
System.out.println("我在工作!");
}
}
/* 销售人员 */
class Salesman extends Worker
{
public int age = 24;
public void work()
{
System.out.println("我正在推销商品!");
}
}
/* 测试类 */
class Test
{
public static void main(String[] args)
{
Worker worker = new Salesman();
System.out.println(worker.age);
worker.work();
}
}
2016年04月25日 07点04分 2
当子类实例被赋予父类引用时,其访问的数据成员将是父类的数据成员,而其调用的方法将是子类的方法
2016年04月25日 07点04分
level 11
2008常青树 楼主
注意:如果希望在父类型引用访问子类实例时使用子类中的数据成员,可以将数据成员的访问权限设定为私有的,然后以该数据成员添加访问方法的形式达到目的
2016年04月25日 07点04分 3
level 11
2008常青树 楼主
/*****************************************************
* 多态性示例
*
* @author
****************************************************/
/* 基类定义 */
class Student
{
public void introduce()
{
System.out.println("我是张三,是一个学生!");
}
}
/* 大学生类定义 */
class UniversityStu extends Student
{
public void introduce()
{
System.out.println("我是张三,今年22岁,就读于北京大学!");
}
}
/* 中学生类定义 */
class MiddleStu extends Student
{
public void introduce()
{
System.out.println("我是李四,今年15岁,就读于育才中学!");
}
}
/* 小学生类定义 */
class PrimaryStu extends Student
{
public void introduce()
{
System.out.println("我是王五,今年9岁,就读于华尔街小学!");
}
}
/* 包含有多态方法的类 */
class Ploymorphism
{
public void sayMe(Student stu)
{
stu.introduce();
}
}
/* 测试类 */
class Test
{
public static void main(String[] args)
{
Ploymorphism pmp = new Ploymorphism();
UniversityStu us = new UniversityStu();
MiddleStu ms = new MiddleStu();
PrimaryStu ps = new PrimaryStu();
pmp.sayMe(us);
pmp.sayMe(ms);
pmp.sayMe(ps);
}
}
2016年04月25日 08点04分 4
1