- 浏览: 209669 次
- 性别:
- 来自: 哈尔滨
文章分类
- 全部博客 (267)
- java.lang (8)
- 问题汇总 (21)
- 异常记录 (20)
- 功能实现 (19)
- 面试总结 (25)
- 技巧总结 (8)
- 常用代码 (4)
- 编程习惯 (3)
- 编码规则 (3)
- java.util (10)
- java.io (1)
- JavaWeb (9)
- MySQL (16)
- SVN (3)
- MyBatis (11)
- Velocity (7)
- 其他知识 (10)
- 人生哲理 (1)
- 人生故事 (1)
- 自我感悟 (1)
- shiro (3)
- 基础知识 (0)
- 问题总结 (1)
- Spring 标签 (1)
- Spring (3)
- 点滴生活 (1)
- DOS (1)
- CAS (4)
- Linux (9)
- Storm (6)
- Shell (1)
- regex (1)
- Collection (4)
- poi (1)
- 经典语句 (1)
- NIO (5)
- concurrent (14)
- RPC (1)
- zookeeper (3)
- 待整理 (2)
- Hadoop (9)
- RabbitMq (2)
- flume (1)
- hive (7)
- hbase (4)
- kafka (1)
- scala (1)
- GC (0)
- java.util.concurrent.atomic (1)
- java.lang.ref (6)
- JVM (2)
- algorithm (1)
- conception (1)
- java key word (1)
- sun.misc (1)
最新评论
问题:重载(overloading)与重写(overriding)的区别
1.equals比较问题
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
Console输出:
MethodOverrideVsOverload equals method reached
objects o1 and o2 are equal
MethodOverrideVsOverload equals method reached
objects o3 and o4 are equal
3.
(1)重写与重载的对比
运行时与编译时
(2)子类重写父类方法时注意
(3)代码举例
a.重载
Test.java
编译后Test.class
说明:编译期间,根据参数类型即决定调用第几个方法
即编译器可以根据参数的类型来选择使用哪个方法。
b.重写
编译器是没法知道传入的参数reference的类型是A还是B。因此,只能够在运行时,根据赋给输入变量“reference”的对象的类型(例如,A或者B的实例)来决定调用的方法.
上面测试用例输出结果:11,运行的是子类重写的方法
参考文献:
http://www.importnew.com/2228.html
http://www.importnew.com/1796.html
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
发表评论
-
京东商城--商城研发部面试
2017-12-01 19:30 5832017年12月01日 笔试题目 1. final fina ... -
海量日志数据,提取出某日访问百度次数最多的那个IP
2017-11-29 21:18 2218问题:一个的日志文件中存放IP地址,按照访问量对IP地址取访问 ... -
输出十进制数字的二进制数的表示
2017-11-03 23:16 1095一、代码如下: public static void m ... -
将数组中的内容随机打乱
2017-10-27 22:45 508问题:斗地主游戏,开局会将纸牌重新打乱,请用数组的随机排序实现 ... -
JVM基础
2017-10-26 22:41 417一、Java 运行时区域 《 ... -
String为什么使用final 修饰
2017-10-25 22:32 964主要是为了”安全性“和”效率“的缘故 1、由于String类 ... -
沐金地面试记录
2017-10-25 22:15 50110.25 下午同事帮忙投递的,约在晚上面试,下班之后赶紧去了 ... -
JD广告部面试经历
2017-10-23 16:46 425同事的同事招聘,于是同事帮忙推荐了一下! 2017年10月1 ... -
编程题目(一)
2017-09-28 22:28 3951.函数:参数为两个字符串a,b ,判断 b 中是否包含 a ... -
值传递与引用传递
2017-05-30 12:25 324一、值传递与引用传递 其实按值还是按引用的区别在于“是否在传 ... -
装箱与拆箱
2016-10-24 22:46 524public class IntegerTest { ... -
可变性与不可变性
2015-06-01 20:55 444String StringBuilder StringBuff ... -
CS架构和BS架构的区别
2015-05-25 08:50 477一、简介 1.C/S结构,即 ... -
HTTP常见响应状态码
2015-05-20 08:26 415问题:程序调试过程中 ... -
JIT的概念
2015-05-19 18:48 702参考文献: http://blog.csdn.net/yan ... -
JDK与JRE与JVM的区别
2015-05-19 18:45 10941.JDK (1)概念 JDK : Java Developm ... -
运行时与编译时
2015-05-17 18:05 533运行时与编译时 博文转载:http://www.import ... -
System.exit(0)与return的区别
2015-05-17 16:49 1020问题:System.exit(0)与return的区别 1. ... -
==和equals
2015-05-15 20:07 649参考文献: http://www.cnblogs.com/zh ... -
return finally 与 System.exit(n)
2015-05-10 18:00 665问题:System.exit(n);的含义以及作用 说明: ...
相关推荐
在编程语言中,方法重载(Overloading)和方法重写(Overriding)是两个非常重要的概念,它们都是实现多态性(Polymorphism)的关键机制。本文将深入探讨这两个概念,以及它们在实际编程中的应用。 ### 方法重载...
重载Overloading是一个类中多态性的一种表现。在Java中,方法重载就是在类中创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用...
重载Overloading是一个类中多态性的一种表现。 (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。 调用方法时通过传递给它们的不同参数个数和参数...
重载Overloading是一个类中多态性的一种表现。Java 中的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体...
在Java编程语言中,方法的重载(Overloading)与重写(Overriding)是两个非常重要的概念。它们虽然只有一字之差,但其实质却大相径庭。理解这两者的不同对于深入掌握Java语言至关重要。 ### 一、重载(Overloading...
Java中的重载(Overloading)和重写(Overriding)是面向对象编程中两个重要的概念,它们体现了Java的多态性。多态性是面向对象编程的三大特性之一,另外两个是封装和继承。 首先,让我们详细解释一下方法的重载。重载...
### C++中重载、重写(覆盖)与隐藏的概念及区别 #### 一、引言 在C++面向对象编程中,理解重载、重写(覆盖)以及隐藏的概念至关重要。这些概念不仅有助于我们更好地设计类和继承体系,还能帮助我们避免一些常见的...
### C++中重载与重写函数的区别及虚函数详解 #### 一、虚函数概述 **1.1 虚函数定义与作用** 在C++中,虚函数是一种特殊的成员函数,它允许子类覆盖父类的行为。虚函数的核心在于实现多态性,即在运行时动态决定...
Java 中的重载(Overloading)与重写(Overriding)是两个重要的概念,它们都是实现多态性的重要方式,但两者之间存在着显著的区别。 **重载(Overloading)** 重载是指在同一个类中可以有多个同名方法,但这些...
Java编程语言中,方法的两种重要特性是方法重载(Overloading)和方法重写(Overriding)。这两种机制都是为了实现多态性,但它们在实际应用中有着明显的区别。 **方法重载(Overloading)**: 方法重载发生在同一...
在面向对象编程中,方法的重写(Overriding)和重载(Overloading)是非常重要的概念。这两种机制可以帮助程序员更灵活地管理和组织代码,提高代码的复用性和可扩展性。 #### 二、重载(Overloading) **定义:** ...
Java中的重载(Overloading)和重写(Overriding)是面向对象编程中的两种关键特性,它们涉及到方法的多态性。理解这两者的区别对于编写高效、可维护的代码至关重要。 **重载(Overloading)**是指在一个类中,可以有多个...
Java 中的重载(Overloading)和重写(Overriding)是两个重要的概念,它们都是实现多态性的重要方式,但两者之间存在着显著的区别。 **重载(Overloading)** 重载是同一个类中不同方法的实现,这些方法拥有相同...
Java 中的重载(Overloading)和重写(Overriding)是两个非常重要的概念,它们都是多态性的体现形式。 一、Java 中的重载(Overloading) Java 中的重载是指在同一个类中可以创建多个方法,它们具有相同的名字,...
在 Java 编程语言中,方法的重载(Overloading)和重写(Overriding)是面向对象编程的重要概念。这两种技术使得方法能够在不同的上下文中表现出不同的行为,从而增强了代码的灵活性和可读性。下面将深入探讨 Java ...
重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。Overloaded的方法是可以改变返回值的类型。也就是说,重载的返回值类型可以相同也可以不同。 重载(Overloading) a、...
JAVA重写和重载(Overriding和Overloading) JAVA中有两种不同的多态性表现形式:重写(Overriding)和重载(Overloading)。下面将对这两种形式进行详细的解释。 重载(Overloading) 重载是指在一个类中可以...
Java编程语言中的重载(Overloading)和重写(Overriding)是两个关键的概念,它们都是多态性的重要体现,但各自有着不同的含义和规则。 首先,我们来详细了解一下方法的重载。重载,简单来说,就是在一个类中定义多个...
重写(Overriding)是指子类可以提供与父类相同签名的方法,但提供不同的实现。重写只发生在继承关系中,子类方法必须声明为`@Override`(在Java中),以确保该方法确实覆盖了父类的相应方法。在运行时,如果对象是...