设为首页 加入收藏

TOP

Java 多态——与C++的比较
2017-01-02 08:15:14 来源: 作者: 【 】 浏览:31
Tags:Java 多态 比较

学习了Java和C++之后,由于长期不使用C++,而java的基础知识掌握不牢,现在已经搞不清java多态了。现在先来谈谈java多态,稍后有时间再更新C++的多态,并进行比较~


一. Java的多态


首先什么是Java的多态?


多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。



Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。


1. 方法的重载


方法的重载是指在一个类中,出现多个方法名相同,但参数个数或参数类型不同的方法,则称为方法的重载。Java在执行具有重载关系的方法时,将根据调用参数的个数和类型区分具体执行的是哪个方法。


【例1】 定义一个名称为Calculate的类,在该类中定义两个名称为getArea()的方法(参数个数不同)和两个名称为draw()的方法(参数类型不同)。



package test;



public class Calculate {
final float PI = 3.14159f;
public float getArea(float r){
float area = PI * r *r;
return area;
}
public float getArea(float l,float w){
float area = 1 * w;
return area;
}
public void draw(int num){
System.out.println("画"+num+"个任意形状的图形");

}
public void draw(String shape){
System.out.println("画一个"+shape);

}
public static void main(String[] args){
Calculate calculate = new Calculate();
float l = 20;
float w = 30;
float areaRectangle = calculate.getArea(l,w);
System.out.println("求长为"+l+"宽为"+w+"的矩形的面积是:"+areaRectangle);
float r = 7;
float areaCirc = calculate.getArea(r);
System.out.println("求半径为"+r+"的圆的面积是:"+areaCirc);
int num = 7;
calculate.draw(num);
calculate.draw("三角形");

}
}


执行结果如下图所示:



重载的方法之间并不一定必须有联系,但是为了提高程序的可读性,一般只重载功能相似的方法。


注意:在方法重载时,方法的返回值类型不能作为区分方法重载的标志。


2.方法的覆盖(重写)


当子类继承父类中所有可能被子类访问的成员方法时,如果子类的方法名与父类的方法名相同,那么子类就不能继承父类的方法,此时,称子类的方法覆盖了父类的方法。覆盖体现了子类补充或者改变父类方法的能力,通过覆盖,可以使一个方法在不同子类中表现出不同的行为。


【例2】定义动物类Animal及它们的子类,然后在Zoo类中分别创建各个子类对象,并调用子类覆盖父类的cry()方法。


(1)创建一个名称为Animal的类,在该类中声明一个成员方法cry():



package example_2;



public class Animal {



public Animal() {

}
public void cry(){
System.out.println("动物发出叫声!");
}



}


(2)创建一个Animal类的子类Dog类,在该类中覆盖父类的成员方法cry():


package example_2;


public class Dog extends Animal {


public Dog() {
}


public void cry(){
System.out.println("狗发出“汪汪.....”声!");
}


}


(3)再创建一个Animal类的子类Cat类,在该类中覆盖了父类的成员方法cry():


package example_2;


public class Cat extends Animal{


public Cat() {
}
public void cry(){
System.out.println("猫发出“喵喵....”声!");
}


}


(4)再创建一个Animal类的子类Cattle类,在该类中不定义任何方法:


(5)创建Zoo类,在该类的main()方法中分别创建子类Dog,Cat和Cattle的对象并调用它们的cry()成员方法:


package example_2;


public class Zoo {


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Dog dog = new Dog();
System.out.println("执行dog.cry();语句时的输出结果:");
dog.cry();
Cat cat = new Cat();
System.out.println("执行cat.cry();语句时的输出结果:");
cat.cry();
Cattle cattle = new Cattle();
System.out.println("执行cattle.cry();语句时的输出结果:");
cattle.cry();


}


}


运行结果如下图所示:



从上面的运行结果中可以看出,由于Dog类和Cat类都重写了父类的方法cry(),所以执行的是子类中的cry()方法,但是Cattle类没有重写父类的方法,所以执行的是父类中的cry()方法。事实上,在Zoo类中,如下写法更能体现多态性:


package example_2;


public class Zoo {


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal animal;
animal = new Dog();
System.out.println("执行animal.cry();语句时的输出结果:");
animal.cry();
animal = new Cat();
System.out.println("执行animal.cry();语句时的输出结果:");
animal.cry();
animal = new Cattle();
System.out.println("执行animal.cry();语句时的输出结果:");
animal.cry();


}


}


在进行方法覆盖时,需要注意一下几点:


3.接口实现




】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Python中三目运算符的正确用法及.. 下一篇servlet监听器实现在线人数统计源..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

最新文章

热门文章

C 语言

C++基础

windows编程基础

linux编程基础

C/C++面试题目