重载与重写
date
Sep 25, 2017
slug
重载与重写
status
Published
tags
Java
summary
type
Post
什么是方法签名?
方法签名就是方法名称+方法参数(包括参数类型、个数和顺序),但不包括返回类型、修饰符和声明异常。
重载
方法重载就是在同一个类内,方法具有相同方法名但方法参数不同,返回类型可相同可不相同。参考下Oracle教程定义:
The Java programming language supports overloading methods, and Java can distinguish between methods with different method signatures. This means that methods within a class can have the same name if they have different parameter lists (there are some qualifications to this that will be discussed in the lesson titled "Interfaces and Inheritance").
翻译:Java语言支持重载方法。Java可以根据不同的方法签名进行方法区分。这意味着在同一类内对于有不同参数列表的方法,他们可以有相同的名字。
以下方法都是方法重载:
即使参数类型和个数相同但是顺序不同也算重载的,但是以下这两个就不是了
对于上面第二个方法IDE会提示方法已定义,以为他们的方法签名一样,即使他们的返回类型不同。
重写
重写是什么这里引用Oracle上Java教程的定义:
An instance method in a subclass with the same signature (name, plus the number and the type of its parameters) and return type as an instance method in the superclass overrides the superclass's method.
翻译:对于子类中的实例方法与父类中的实例方法具有相同的方法签名和返回类型会则子类的实例方法会覆盖父类的实例方法。重写定义包括了返回类型。重写有几点需要注意的:
- 不能重写private方法、
- 重写的方法的修饰符权限不能比父类低
- 重写实例方法,子类方法会覆盖父类方法
- 静态方法无法重写,如果子类存在与父类相同的方法,对于父类引用而言,子类方法被隐藏,对于子类引用,父类方法被隐藏(自己理解的)
- 实例方法不能重写为静态方法,静态方法不能重写为实例方法
下面用代码来测试下:
结果输出:
基于以上输出结果:
- 对于privateMethod,Animal类中的修饰是private,Eagle类虽然也有相同的方法,但那只属于Ealge类的实例方法。
- Animal类中的instanceMethod在Eagle类中被重写,Animal类引用实际上执行的是子类的方法。
- Animal类中的protected方法在子类中被重写,修饰符为public,同样执行的是子类方法。
- 静态方法无法被重写,如存在相同的方法取决于类。
是否需要@Override注解?
@Override注解可加可不加,默认约定加上,加上会检查重写是否符合规则,如上面的Eagle类,在privateMethod、staticMethod方法上加@Override注解编译会因找不到父类方法报错,因为私有实例方法和静态方法是无法被重写,没加@Override注解那就成为子类的方法,与父类方法并无关系。
参考链接: