`

重载(overloading)与重写(overriding)

阅读更多
问题:重载(overloading)与重写(overriding)的区别

1.equals比较问题
public class MethodOverrideVsOverload {

	public boolean equals( MethodOverrideVsOverload other ) {
	     System.out.println("MethodOverrideVsOverload equals method reached" );
	     return true;
	   }
	 
	 public static void main(String[] args) {
	  Object o1 = new MethodOverrideVsOverload();
	  Object o2 = new MethodOverrideVsOverload();
	 
	  MethodOverrideVsOverload o3 = new MethodOverrideVsOverload();
	  MethodOverrideVsOverload o4 = new MethodOverrideVsOverload();
	 
	  if(o1.equals(o2)){
	   System.out.println("objects o1 and o2 are equal");
	  }
	 
	  if(o3.equals(o4)){
	   System.out.println("objects o3 and o4 are equal");
	  }
	 }
}


Console输出:
MethodOverrideVsOverload equals method reached
objects o3 and o4 are equal


结果分析与解释:
1.单元测试类中第15运行结果为false
分析:
(1)对于object类型,其== 与 equals 同样都是比较内存地址,所以为false,
(2)大多数的非final对象类方法都会被子类重写,若没有显示的声明extends父类,默认继承Object类,而只要重写object中equals方法,equals比较的就是对象的内容而非地址
==与equals的区别
(3)可见,在单元测试类中的equals方法,并非是方法重写,而是方法重载;另外一点,其没有@Override标签
注意:
(1)标签,不要删除,其可以帮你检查错误,若重写的方法有函数名称、参数类型的错误,会给与提示,比如:toString() 可能会写成 tostring() ,若这样就是不同的两个方法了,也就不是子类重写父类的方法了
(2)运行报错:
ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183):  [../../../src/share/back/util.c:820]

解决方法:在Main方法中末尾添加System.exit(0);
参考文献:
JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
System.exit(0);与return的区别
2.如何解决——添加@Override
public class MethodOverrideVsOverload {

	@Override
	public boolean equals( Object obejct ) {
	     System.out.println("MethodOverrideVsOverload equals method reached" );
	     return true;
	   }
	 
	 public static void main(String[] args) {
	  Object o1 = new MethodOverrideVsOverload();
	  Object o2 = new MethodOverrideVsOverload();
	 
	  MethodOverrideVsOverload o3 = new MethodOverrideVsOverload();
	  MethodOverrideVsOverload o4 = new MethodOverrideVsOverload();
	 
	  if(o1.equals(o2)){
	   System.out.println("objects o1 and o2 are equal");
	  }
	 
	  if(o3.equals(o4)){
	   System.out.println("objects o3 and o4 are equal");
	  }
	 }
}

Console输出:
MethodOverrideVsOverload equals method reached
objects o1 and o2 are equal
MethodOverrideVsOverload equals method reached
objects o3 and o4 are equal


3.
(1)重写与重载的对比
名称起作用时间举例含义
重载编译时静态绑定静态绑定意味着JVM在编译时决定调用的类或方法
重写运行时动态绑定动态绑定时,JVM是在运行时决定调用的类或方法,动态绑定设计是多态的基础

运行时与编译时
(2)子类重写父类方法时注意
内容注意事项
参数不可变(包括参数类型和个数)
返回类型不可变,除了协变返回类型或其子类型(covariant (subtype) returns)
异常子类中可以抛出更少的异常,但绝对不能抛出父类中没有定义的已检查异常
访问权限比父类中对应方法更宽松,访问权限要大于父类的访问权限
调用运行时(也就是动态绑定),根据对象类型来决定调用的具体方法

(3)代码举例
a.重载
Test.java
public class Test {

    static final  int number1 = 5;
    
    static final  int number2 = 6;
 
    static int number3 = 5;
 
    static int number4= 6;
 
    public static void main(String[ ] args) {
 
          int product1 = number1 * number2;         //line A
 
          int product2 = number3 * number4;         //line B
		  
		  System.out.println(product1 + " "+product2);
		  
		  showMessage(product1);
		  
		  showMessage(String.valueOf(product2));
 
    }

    public static void showMessage(String message){
		System.out.println(message+"123");
	}
	public static void showMessage(int message){
		System.out.println(message+1234);
	}
}

编译后Test.class

import java.io.PrintStream;

public class Test
{
  static final int number1 = 5;
  static final int number2 = 6;
  static int number3 = 5;
  static int number4 = 6;

  public static void main(String[] paramArrayOfString)
  {
    int i = 30;

    int j = number3 * number4;

    System.out.println(i + " " + j);

    showMessage(i);

    showMessage(String.valueOf(j));
  }

  public static void showMessage(String paramString)
  {
    System.out.println(paramString + "123"); }

  public static void showMessage(int paramInt) {
    System.out.println(paramInt + 1234);
  }
}


说明:编译期间,根据参数类型即决定调用第几个方法
即编译器可以根据参数的类型来选择使用哪个方法。

b.重写
public class A {
	public void showMessage(String message){
		System.out.println(message);
	}
}
public class B extends A {
	public void showMessage(String message){
		System.out.println(message+"1");
	}
	public static void main(String[] args) {
		test();
	}	
	public static void test(){
		A test = new B();
		test.showMessage("1");
	}
}

编译器是没法知道传入的参数reference的类型是A还是B。因此,只能够在运行时,根据赋给输入变量“reference”的对象的类型(例如,A或者B的实例)来决定调用的方法.
上面测试用例输出结果:11,运行的是子类重写的方法
参考文献:
http://www.importnew.com/2228.html
http://www.importnew.com/1796.html
分享到:
评论

相关推荐

    方法重载和方法重写

    在编程语言中,方法重载(Overloading)和方法重写(Overriding)是两个非常重要的概念,它们都是实现多态性(Polymorphism)的关键机制。本文将深入探讨这两个概念,以及它们在实际编程中的应用。 ### 方法重载...

    Overloading&Overriding

    重载Overloading是一个类中多态性的一种表现。在Java中,方法重载就是在类中创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用...

    重载与覆写/重写的区别

     重载Overloading是一个类中多态性的一种表现。 (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。  调用方法时通过传递给它们的不同参数个数和参数...

    java中重载与重写的区别.pdf

    重载Overloading是一个类中多态性的一种表现。Java 中的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体...

    java中重载与重写

    在Java编程语言中,方法的重载(Overloading)与重写(Overriding)是两个非常重要的概念。它们虽然只有一字之差,但其实质却大相径庭。理解这两者的不同对于深入掌握Java语言至关重要。 ### 一、重载(Overloading...

    java中的重载和重写的区别

    Java中的重载(Overloading)和重写(Overriding)是面向对象编程中两个重要的概念,它们体现了Java的多态性。多态性是面向对象编程的三大特性之一,另外两个是封装和继承。 首先,让我们详细解释一下方法的重载。重载...

    c++ 重载、覆盖、重写

    ### C++中重载、重写(覆盖)与隐藏的概念及区别 #### 一、引言 在C++面向对象编程中,理解重载、重写(覆盖)以及隐藏的概念至关重要。这些概念不仅有助于我们更好地设计类和继承体系,还能帮助我们避免一些常见的...

    C++中重载与重写函数区别及虚函数

    ### C++中重载与重写函数的区别及虚函数详解 #### 一、虚函数概述 **1.1 虚函数定义与作用** 在C++中,虚函数是一种特殊的成员函数,它允许子类覆盖父类的行为。虚函数的核心在于实现多态性,即在运行时动态决定...

    java中重载与重写的区别

    Java 中的重载(Overloading)与重写(Overriding)是两个重要的概念,它们都是实现多态性的重要方式,但两者之间存在着显著的区别。 **重载(Overloading)** 重载是指在同一个类中可以有多个同名方法,但这些...

    Java方法重载和方法重写的区别.docx

    Java编程语言中,方法的两种重要特性是方法重载(Overloading)和方法重写(Overriding)。这两种机制都是为了实现多态性,但它们在实际应用中有着明显的区别。 **方法重载(Overloading)**: 方法重载发生在同一...

    重写和重载的区别

    在面向对象编程中,方法的重写(Overriding)和重载(Overloading)是非常重要的概念。这两种机制可以帮助程序员更灵活地管理和组织代码,提高代码的复用性和可扩展性。 #### 二、重载(Overloading) **定义:** ...

    Java重载和重写的区别--源码实例

    Java中的重载(Overloading)和重写(Overriding)是面向对象编程中的两种关键特性,它们涉及到方法的多态性。理解这两者的区别对于编写高效、可维护的代码至关重要。 **重载(Overloading)**是指在一个类中,可以有多个...

    java中重载与重写的区别.doc.docx

    Java 中的重载(Overloading)和重写(Overriding)是两个重要的概念,它们都是实现多态性的重要方式,但两者之间存在着显著的区别。 **重载(Overloading)** 重载是同一个类中不同方法的实现,这些方法拥有相同...

    Java中重载和重写总结

    Java 中的重载(Overloading)和重写(Overriding)是两个非常重要的概念,它们都是多态性的体现形式。 一、Java 中的重载(Overloading) Java 中的重载是指在同一个类中可以创建多个方法,它们具有相同的名字,...

    Java方法的艺术:重载与重写的深度解析

    在 Java 编程语言中,方法的重载(Overloading)和重写(Overriding)是面向对象编程的重要概念。这两种技术使得方法能够在不同的上下文中表现出不同的行为,从而增强了代码的灵活性和可读性。下面将深入探讨 Java ...

    PHP面相对象中的重载与重写

    重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。Overloaded的方法是可以改变返回值的类型。也就是说,重载的返回值类型可以相同也可以不同。 重载(Overloading) a、...

    JAVA重写和重载.pdf

    JAVA重写和重载(Overriding和Overloading) JAVA中有两种不同的多态性表现形式:重写(Overriding)和重载(Overloading)。下面将对这两种形式进行详细的解释。 重载(Overloading) 重载是指在一个类中可以...

    Java的重载和重写

    Java编程语言中的重载(Overloading)和重写(Overriding)是两个关键的概念,它们都是多态性的重要体现,但各自有着不同的含义和规则。 首先,我们来详细了解一下方法的重载。重载,简单来说,就是在一个类中定义多个...

    继承与多态,重载和重写

    重写(Overriding)是指子类可以提供与父类相同签名的方法,但提供不同的实现。重写只发生在继承关系中,子类方法必须声明为`@Override`(在Java中),以确保该方法确实覆盖了父类的相应方法。在运行时,如果对象是...

Global site tag (gtag.js) - Google Analytics