现在的位置: 首页 > 算法 > 正文

JAVA重载(overload)和覆盖(override)有哪些陷阱

2020年05月21日 算法 ⁄ 共 1753字 ⁄ 字号 评论关闭

  大家都知道重载是指在同一个类中,定义了有相同名称但是有不同参数类型的方法时,到底调用那一个方法会根据参数类型来选择。下面学步园小编来讲解下JAVA重载(overload)和覆盖(override)有哪些陷阱?

  JAVA重载(overload)和覆盖(override)有哪些陷阱

  classParentClass{

  }

  classChildClassextendsParentClass{

  }

  publicclassTest{

  publicvoidtestOverLoad(ParentClasscls){

  System.out.println("It'sParentClass");

  }

  publicvoidtestOverLoad(ChildClasscls){

  System.out.println("It'sChildClass");

  }

  publicstaticvoidmain(String[]args){

  Testtest=newTest();

  ParentClassparentCls=newParentClass();

  ParentClasschildCls=newChildClass();

  test.testOverLoad(parentCls);

  test.testOverLoad(childCls);

  }

  }

  JAVA重载(overload)和覆盖(override)有哪些陷阱

  大家想想输出的结果应该是什么呢,答案是:

  It'sParentClass

  It'sParentClass

  原因是决定方法重载是在编译的时候发生,而不是在运行的时候.

  覆盖是指在父类和子类有相同名称参数的方法,子类的方法覆盖父类的方法.来看下面的例子

  publicclassParentClass{

  publicStringstr1="Parent1";

  publicStringstr2="";

  publicParentClass(){

  str2="Parent2";

  }

  publicvoidfunc(){

  System.out.println("ParentClass.func");

  }

  publicStringgetStr2(){

  returnstr2;

  }

  }

  publicclassChildClassextendsParentClass{

  publicStringstr1="Child1";

  publicStringstr2="";

  publicChildClass(){

  str2="Child2";

  }

  publicvoidfunc(){

  System.out.println("ChildClass.func");

  }

  publicStringgetStr2(){

  returnstr2;

  }

  }

  publicclassTest

  publicstaticvoidmain(String[]args){

  ParentClasschildCls=newChildClass();

  System.out.println(childCls.str1);

  System.out.println(childCls.str2);

  System.out.println(childCls.getStr2());

  childCls.func();

  }

  }

  输出的结果应该是什么呢,答案是:

  Parent1

  Parent2

  Child2

  ChildClass.func

  原因是对于方法的覆盖发生在运行时,所以子类的方法被调用.而对于变量的覆盖是在编译的时候决定的,childCls在编译的时候类型是ParentClass,所以对变量的直接访问得到的是ParentClass中定义的值.对于成员变量,编译器会对父类和子类的所有成员变量都保存一份拷贝,所以这才有了方法的多态,并没有变量的多态。

  以上就是关于“JAVA重载(overload)和覆盖(override)有哪些陷阱”的内容,希望对大家有用。更多资讯请关注学步园。学步园,您学习IT技术的优质平台!

抱歉!评论已关闭.