java基础梳理-理解重载与重写

55、重载和重写的区别
重载(Overloading)和重写(Overriding)是Java中两个比较重要的概念。名字相近而已,没有实质关联。

定义

重载

简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

重写

重写指的是在Java的子类与父类中有两个名称、参数列表都相同的方法的情况。由于他们具有相同的方法签名,所以子类中的新方法将覆盖父类中原有的方法。

重载的目的是使得我们能够用用一个统一的接口名称来调用一系列方法。这些方法的目的也许是一样的,但是它们的实现方式会根据传入的参数不同而不同。

重写涉及到继承这个概念中的问题。子类继承了父类的方法,但是它可能需要有不同的操作行为,这时候就需要在子类中重写这个父类方法。

1、重载是一个编译期概念、重写是一个运行期间概念。

2、重载遵循所谓“编译期绑定”,即在编译时根据参数变量的类型判断应该调用哪个方法。

3、重写遵循所谓“运行期绑定”,即在运行的时候,根据引用变量所指向的实际对象的类型来调用方法

4、因为在编译期已经确定调用哪个方法,所以重载并不是多态。而重写是多态。重载只是一种语言特性,是一种语法规则,与多态无关,与面向对象也无关。(注:有人说重载Overloading是一个类中多态性的一种表现,但严格来说,重载是编译时多态,即静态多态。但是,Java中提到的多态,在不特别说明的情况下都指动态多态)

重写demo如下:

上面的例子中, dog 对象被定义为 Dog 类型。在编译期,编译器会检查Dog类中是否有可访问的 bark() 方法,只要其中包含 bark() 方法,那么就可以编译通过。在运行期, Hound 对象被 new 出来,并赋值给 dog 变量,这时,JVM是明确的知道 dog 变量指向的其实是 Hound 对象的引用。所以,当 dog 调用 bark() 方法的时候,就会调用 Hound 类中定义的 bark() 方法。这就是所谓的动态多态性。
重载demo如下:
 

 上面的代码中,定义了两个bark方法,一个是没有参数的bark方法,另外一个是包含一个int类型参数的bark方法。在编译期,编译期可以根据方法签名(方法名和参数情况)情况确定哪个方法被调用。

重载和重写的关键点

  • private: 一个私有的java方法是不能被重写的,因为它对子类压根就不可见

  • final:重载一个final的方法是可以的,但是不能重写它,因此父类如果将方法声明为final的就可保证所有子类的调用此方法时调用的都是父类的方法。

  • final:如果两个方法有同样的参数列表,而其中一个的参数被声明为final的这种情况下这两个方法完全一样,因此不可重载。编译都通不过,因为这两个方法被视为完全一样。

  • static:可以重载一个静态的Java方法但是不能重写静态的Java方法,因为静态方法在方法区中只有一个。

  • static:重载是关于对象(实例)和继承而言的。一个声明为静态的方法属于整个类(对于这个的所有对象都是一样的)。因此重写它没有任何意义。

  • static:对于重载,两个静态方法的重载没有什么特别的,只不过是修饰符多了个static修饰符。参数列表依然必须不同。

****************************************************
参考:
http://www.hollischuang.com/archives/1308?utm_source=tuicool&utm_medium=referral
http://youli9056.github.io/blog/overloading-and-overriding/

你可能感兴趣的:(java)