`

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

    java面试题

    重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,...

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

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

    最新最全Java面试题汇总

    重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。 52、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收

    Java SE 基础知识题库

    java中实现多态的机制是什么?...方法的重写Overriding和重载Overloading是Java多态性的不同表现。 重写(Overriding)是父类与子类之间多态性的一种表现; 重载(Overloading)是一个类中多态性的一种表现。

    java面试葵花宝典

    java面试题大全 40、构造器Constructor是否可被override? 构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

    Java面试宝典(基础篇).docx

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

    详解JavaScript中的构造器Constructor模式

    构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。构造器用于创建特定类型对象——准备好对象以备使用,同时接收构造器可以使用的参数,以在第一次创建对象时,设置成员属性和方法的...

    PHP中overload与override的区别

    override(重写,覆盖) 1、方法名、参数、返回值相同。 2、子类方法不能缩小父类方法的访问权限。 3、子类方法不能抛出比...重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个类中多态

    java 经典面试题 于网络分享

    5. Java语言中,方法的重写(Overriding)和重载(Overloading)是多态性的不同表现。下边哪些说法是对的? A. 重写是父类与子类之间多态性的一种表现。 B. 重写是一个类中多态性的一种表现。 C. 重载是一个类中...

    进销存系统文档作业例子

    重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,...

    Java overload和override的区别分析

    方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现,想要了解更多请参考本

    [多媒体/3D 动画/游戏] Unity3D游戏编程基础入门班 by 泰课在线(价值200元)[高清完整版][AVI+TS][1.43GB]

    课时18 方法重载Overloading 课时19 代理Delegates 课时20 单例设计模式Singletons 基础入门之进入Unity的世界 课时1 Unity介绍 课时2 Unity下载和安装 课时3 Unity 破解 课时4 Unity 什么是工程 课时5 Unity 学习...

    超级有影响力霸气的Java面试题大全文档

    重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,...

    JAVA面试题最全集

    7.Java多态的实现(继承、重载、覆盖) 8.编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。 9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能...

    java 面试题 总结

    重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,...

    net学习笔记及其他代码应用

    答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。 42.是否可以继承String类? 答:String类是final类故不可以继承。 43.try {}里有一个return语句,那么紧跟在这个try后的...

Global site tag (gtag.js) - Google Analytics