java重写与重载的详解与区别

重写(Override)
重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。
也就是说子类能够根据需要实现父类的方法。
在面向对象原则里,重写意味着可以重写任何现有方法。实例如下:
class?Animal{
?
???public?void?move(){
??????System.out.println("动物可以移动");
???}
}
?
class?Dog?extends?Animal{
?
???public?void?move(){
??????System.out.println("狗可以跑和走");
???}
}
?
public?class?TestDog{
?
???public?static?void?main(String args[]){
??????Animal a =?new?Animal();?// Animal 对象
??????Animal b =?new?Dog();?// Dog 对象
?
??????a.move();// 执行 Animal 类的方法
?
??????b.move();//执行 Dog 类的方法
???}
}
以上实例编译运行结果如下:
动物可以移动
狗可以跑和走
在上面的例子中可以看到,尽管b属于Animal类型,但是它运行的是Dog类的move方法。
这是由于在编译阶段,只是检查参数的引用类型。
然而在运行时,Java虚拟机(JVM)指定对象的类型并且运行该对象的方法。
因此在上面的例子中,之所以能编译成功,是因为Animal类中存在move方法,然而运行时,运行的是特定对象的方法。
思考以下例子:
class?Animal{
?
???public?void?move(){
??????System.out.println("动物可以移动");
???}
}
?
class?Dog?extends?Animal{
?
???public?void?move(){
??????System.out.println("狗可以跑和走");
???}
???public?void?bark(){
??????System.out.println("狗可以吠叫");
???}
}
?
public?class?TestDog{
?
???public?static?void?main(String args[]){
??????Animal a =?new?Animal();?// Animal 对象
??????Animal b =?new?Dog();?// Dog 对象
?
??????a.move();// 执行 Animal 类的方法
??????b.move();//执行 Dog 类的方法
??????b.bark();
???}
}
以上实例编译运行结果如下:
1
2
3
4
5 TestDog.java:30: cannot find symbol
symbol? : method bark()
location:?class?Animal
????????????????b.bark();
?????????????????^
该程序将抛出一个编译错误,因为b的引用类型Animal没有bark方法。

方写重写的规则
?参数列表必须完全与被重写方法的相同;
?返回类型必须完全与被重写方法的返回类型相同;
?访问权限不能比父类中被重写的方法的访问权限更高。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
?父类的成员方法只能被它的子类重写。
?声明为final的方法不能被重写。
?声明为static的方法不能被重写,但是能够被再次声明。
?如果一个方法不能被继承,那么该方法不能被重写。
?子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
?子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
?重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
?构造方法不能被重写。
?如果不能继承一个方法,则不能重写这个方法。

Super关键字的使用
当需要在子类中调用父类的被重写方法时,要使用super关键字。
class?Animal{
?
???public?void?move(){
??????System.out.println("动物可以移动);
???}
}
?
class?Dog?extends?Animal{
?
???public?void?move(){
??????super.move();?// 应用super类的方法
??????System.out.println("狗可以跑和走");
???}
}
?
public?class?TestDog{
?
???public?static?void?main(String args[]){
?
??????Animal b =?new?Dog(); /
??????b.move();?//执行 Dog类的方法
?
???}
}
以上实例编译运行结果如下:
动物可以移动
狗可以跑和走
重载(Overload)
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型呢?可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
只能重载构造函数
重载规则
?被重载的方法必须改变参数列表;
?被重载的方法可以改变返回类型;
?被重载的方法可以改变访问修饰符;
?被重载的方法可以声明新的或更广的检查异常;
?方法能够在同一个类中或者在一个子类中被重载。
实例
public?class?Overloading {
??
????public?int?test(){
????????System.out.println("test1");
????????return?1;
????}
??
????public?void?test(int?a){
????????System.out.println("test2");
????}??
??
????//以下两个参数类型顺序不同
????public?String test(int?a,String s){
????????System.out.println("test3");
????????return?"returntest3";
????}??
??
????public?String test(String s,int?a){
????????System.out.println("test4");
????????return?"returntest4";
????}??
??
????public?static?void?main(String[] args){
????????Overloading o =?new?Overloading();
????????System.out.println(o.test());
????????o.test(1);
????????System.out.println(o.test(1,"test3"));
????????System.out.println(o.test("test4",1));
????}

喜欢这样文章的可以关注我,我会持续更新,你们的关注是我更新的动力。需要更多java学习资料的也可以私信我!免费给java小白提供资料!
祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早生贵子,从不掉发!

原文地址:https://blog.51cto.com/14623707/2466746

时间: 2024-11-09 01:54:13

java重写与重载的详解与区别的相关文章

Java 8的default方法详解

Java 8的default方法详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Java 8新增了default方法,它可以在接口添加新功能特性,而且还不影响接口的实现类.下面我们通过例子来说明这一点. public class MyClass implements InterfaceA { public static void main(String[] args){ } @Override public void saySomething(

【java项目实战】Servlet详解以及Servlet编写登陆页面(二)

Servlet是Sun公司提供的一门用于开发动态web网页的技术.Sun公司在API中提供了一个servlet接口,我们如果想使用java程序开发一个动态的web网页,只需要实现servelet接口,并把类部署到web服务器上就可以运行了. 到底什么是Servlet呢? 通俗一点,只要是实现了servlet接口的java程序,均称Servlet.Servlet是由sun公司命名的,Servlet = Server + Applet(Applet表示小应用程序),Servlet是在服务器端运行的小

JAVA:23种设计模式详解(转)2

我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式.装饰模式.代理模式.外观模式.桥接模式.组合模式.享元模式.其中对象的适配器模式是各种模式的起源,我们看下面的图: 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.首先,我们来看看类的适配器模式,先看类图: 核心思想就是:有一个Source类,拥有一个方法,待适配,目标接口时

Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introduction/ netty是基于NIO实现的异步事件驱动的网络编程框架,学完NIO以后,应该看看netty的实现,netty框架涉及的内容特别多,这里只介绍netty的基本使用和实现原理,更多扩展的内容将在以后推出. 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎

Java网络编程和NIO详解8:浅析mmap和Direct Buffer

Java网络编程与NIO详解8:浅析mmap和Direct Buffer 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2pl/ Java网络编程与NIO详解8:浅析mmap和Direct Buffer 之前看到一篇文章说epoll中在维护epo

(转)Java并发包基石-AQS详解

背景:之前在研究多线程的时候,模模糊糊知道AQS这个东西,但是对于其内部是如何实现,以及具体应用不是很理解,还自认为多线程已经学习的很到位了,贻笑大方. 这里的源码还没有能够完整的跟下来,后面还要继续努力完善. Java并发包基石-AQS详解 Java并发包(JUC)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrangLock.Semaphore,它们的实现都用到了一个共同的基类--AbstractQueuedSynchronizer,简称AQS.AQS是一个用来构建

java 深拷贝与浅拷贝机制详解

 java 深拷贝与浅拷贝机制详解            --摘自-https://www.jb51.net/article/106088.htm 概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定义的clone方法为深拷贝. (一)Object中clone方法 如果我们new出一个新对象,用一个声明去引用它,之后又用另一个声明去引用前一个声明,那么最后的结果是:这两个声明的变量将

Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统为 CentOS 6.4 x86_64 , Nginx 是版本是最新版的1.4.2,所以实验用到的软件请点击这里下载:http://yunpan.cn/QXIgqMmVmuZrm 一.前言 在前面的几篇博文中我们主要讲解了Nginx作为Web服务器知识点,主要的知识点有nginx的理论详解.ngin

Java中的main()方法详解

在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等. 在看Java中的main()方法之前,先看一个最简单的Java应用程序HelloWorld,我将通过这个例子说明Java类中main()方法的奥秘,程序的代码如下: 1 /** 2 * Java中的main()方法