首页 技术 正文
技术 2022年11月15日
0 收藏 984 点赞 2,181 浏览 2934 个字

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

一. Java的多态

首先什么是Java的多态?

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

  • 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
  • 多态的作用:消除类型之间的耦合关系。

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类,在该类中不定义任何方法:

 package example_2; public class Cattle extends Animal { }

(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();     } }

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

  • 子类不能覆盖父类中声明为final或者static的方法。
  • 子类必须覆盖父类中声明为abstract的方法,或者子类也将该方法声明为abstract。
  • 子类覆盖父类中的同名方法时,子类中方法的声明也必须和父类中被覆盖的方法的声明一样。

3.接口实现

上一篇: muduo Library
下一篇: python-函数相关
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,086
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,561
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,411
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,184
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,820
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,904