java 多态 重载的区别 java重载和多态的区别

  java重载和多态有什么不同呢?你知道吗?下面是爱华网小编为大家准备的java重载和多态的区别,希望大家喜欢!

  java重载和多态的区别

  多态性也是面向对象方法的一个重要特性.多态性是指在在程序中出现的"重名"现象,即在一个程序中相同的名字可以表示不同的实现.

  在JAVA中,多态性主要表现在如下两个方面:

  (1)方法重载.通常指在同一个类中,相同的方法名对应着不同的方法实现,但是方法的参数不同.

  (2)成员覆盖.通常指在不同类(父类和子类)中,允许有相同的变量名,但是数据类型不同;也允许有相同的方法名,但是对应的方法实现不同.

  在重载的情况下,同一类中具有相同的名字的方法.如何选择它的方法体呢?不能使用类名来区分,通常采用不同的方法形参表,区分重载要求形参在类型,个数和顺序的不同,在定义重载方法时,应在方法的形参的类型,个数和顺序有所不同,以便在选择时能够区别开来.

java 多态 重载的区别 java重载和多态的区别

  在覆盖的情况下,同名的方法存在于不同的类中,在调用方法只要指明其方法所归属的类名就可以了.

  例如

  class Shape {

  void draw() {}

  void erase() {}

  }

  class Circle extends Shape {

  void draw() {

  System.out.println("Circle.draw()");

  }

  void erase() {

  System.out.println("Circle.erase()"); }

  }

  class Square extends Shape {

  void draw() {

  System.out.println("Square.draw()");

  }

  void erase() {

  System.out.println("Square.erase()");

  }

  }

  class Triangle extends Shape {

  void draw() {

  System.out.println("Triangle.draw()");

  }

  void erase() {

  System.out.println("Triangle.erase()");

  }

  }

  public class Test {

  public static Shape randShape() {

  switch((int)(Math.random() * 3)) {

  default:

  case 0: return new Circle();

  case 1: return new Square();

  case 2: return new Triangle();

  } }

  public static void main(String[] args) {

  Shape[] s = new Shape[9];

  for(int i = 0; i < s.length; i++)

  s[i] = randShape();

  for(int i = 0; i < s.length; i++)

  s[i].draw();

  }

  }

  输出结果

  Triangle.draw()

  Circle.draw()

  Triangle.draw()

  Triangle.draw()

  Triangle.draw()

  Square.draw()

  Square.draw()

  Triangle.draw()

  Circle.draw()

  Triangle.erase()

  Circle.erase()

  Triangle.erase()

  Triangle.erase()

  Triangle.erase()

  Square.erase()

  Square.erase()

  Triangle.erase()

  Circle.erase()

  Press any key to continue...

  又一次执行

  Triangle.draw()

  Triangle.draw()

  Circle.draw()

  Circle.draw()

  Circle.draw()

  Triangle.draw()

  Triangle.draw()

  Square.draw()

  Circle.draw()

  Triangle.erase()

  Triangle.erase()

  Circle.erase()

  Circle.erase()

  Circle.erase()

  Triangle.erase()

  Triangle.erase()

  Square.erase()

  Circle.erase()

  Press any key to continue...

  两次执行结果不同的原因是其中的Math.random()这个类导致的,math.random()得到的数是0-1之间的随机数.

  写到这里,我突然想到了方法重载,那么它和多态,覆盖有什么区别呢?

  最重要的一点区别是:通过方法重载进而实现对象的多态性.

  方法重载是指功能相同的多个方法使用同一个方法名.同名的多个方法的参数要有所不同,即在参数类型,参数个数和参数顺序上要有所区别,以便作为选择某个方法的根据.通常只有功能相同的方法进行重载才有意义.

  例如:计算两个数之和的重载方法定义如下:

  int add(int i,int j)

  {retrun i+j;}

  float add(float i,float j)

  {retrun i+j;}

  double add(double i,double j)

  {retrun i+j;}

  重载方法的选择通常是在编译时进行.系统根据不同的参数类型,个数或顺序,寻找最佳匹配方法.方法类型不参与匹配.

  下面是搜到的一些例子.

  public class Base{

  int a,b;

  public Base(int x,int y){

  a = x;

  b = y;

  }

  public int add(){

  return (a + b);

  }

  public void add(int x,int y){

  int z;

  z = x + y;

  }

  }

  上面这段代码就是重载~~~他有三个特征

  1:方法名必须一样 “add()“。

  2:返回类型可以不一样 就象是 ”int “和”void“.

  3:参数可以不一样 就是add() 和add(int x,int y)这样的。

  public class Base{

  int x,y;

  public void add(){

  int z;

  z = x + y;

  }

  }

  public class Child extends Base{

  int x,y;

  public void add(){

  int z;

  z = x + y;

  }

  public static void main(string [] args){

  Base b = new Child();

  b.add();

  }

  }

  下面这个例子就是重写,他实现了多态~~

  重写的要求是,方法名必须一样,返回类型必须一样,传入的参数必须一样

  在main函数中定义父类的对象,但是用子类去实例化他,这样就可以通过父类的对象调用到子类的方法。

  下面还有一个例题.

  public class Parent {

  public int addValue( int a, int b) {

  int s;s = a+b;return s;

  }

  }

  class Child extends Parent {

  }

  Which methods can be added into class Child?

  a int addValue( int a, int b ){// do something...}

  b public void addValue (){// do something...}

  c public int addValue( int a ){// do something...}

  d public int addValue( int a, int b )throws MyException {//do something...}

  答案为B.C

  解释1:

  a是覆盖,b ,c是重载

  a的问题出在访问权限上,如果换成public也是可以的

  d是异常的问题.

  解释2:

  a的访问权限小于父类,所以错误,d是异常错误,b和c中的addValue方法和父类的方法参数不同,所以是重载.

  解释3:

  在同一个类中方法成员的名称相同,但参数的类型和个数不同,这称为重载。

  在存在继承关系的两个话,子类与父类的方法成员名称相同、参数的类型和个数相同的话,子类的方法覆盖父类的方法,这称为覆盖。

  

爱华网本文地址 » http://www.aihuau.com/a/3971471/14000853.html

更多阅读

纸尿裤与纸尿片的区别 纸尿裤和纸尿片哪个贵

纸尿裤与纸尿片其实都是尿不湿婴儿根据设计和使用方法不同来区别根据1可以清楚识别纸尿裤与纸尿片在设计上的区别,也就是有没有固定带,而在价格方面一般同类型的同等产品尿裤的价格会比尿片稍贵几毛钱一片。看完尿片与尿裤的区别让

肉桂与桂皮的区别 肉桂和桂皮区别图片

看了那么多国外的美食片,一直觉得肉桂棒和桂皮实在好像,再网上找到一篇文章觉得区分的还比较清楚,今天终于弄明白它们的区别啦!1.植物科属及发展演进肉桂树是樟树科的常绿植物。野生的肉桂树高10米以上。肉桂是选用新鲜优质的树皮,将其剥

交换机和路由器的区别 猫和路由器的区别具体细分

路由器可以链接多台电脑,这使得它在我们的生活中有着比较重要的作用。猫(其实叫调制解调器)是一种将模拟信号转化成数字信号的设备,上面需要连接电话线。路由器也有交换功能,但一般不做交换机用,现在的路由也有的集成了猫。猫和路由

水性漆和油漆的区别 油漆和水性漆的区别有哪些

涂料是我们经常用到的家装材料,但是很多人对涂料不少很了解,涂料是一个庞大的体系,其中就包括油漆和水性漆。平时我们在使用的时候经常混为一谈,其实他们是有区别的,下面小编就为大家介绍一下油性漆和水性漆的区别有哪些。猜你喜欢:嘉宝

ipad4与ipad5的区别 iPad5和iPad4的区别

iPad5和iPad4的区别――简介日前,iPad Air全新发布,而iPad Air就是我们所说的iPad5,iPad5 是继 iPad4 之后的新一代平板产品,延续了苹果精致的产品风格,下面让小编为大家解答iPad Air与iPad4有什么区别吧!iPad Air和iPad4的区别即刻呈现!i

声明:《java 多态 重载的区别 java重载和多态的区别》为网友安好勿扰分享!如侵犯到您的合法权益请联系我们删除