原
一、final在重载参数的可用性
之前在写代码的时候,在一个重载方法里由于用到里Runnable匿名类,需要对参数进行final指定,由于基类的参数都没有final修饰符,基类的函数原型如下:
public abstract void write(char[] buf, int offset, int count) throws IOException;
所以打算在内部重新声明final变量来赋值,即
@Override	public void write(char[] buf, int offset, int count) throws IOException {	final char[] writeBuf = buf;	}
不过尝试之下,发现可以直接在重载方法上添加final,即使基类的方法里的参数没有声明final,即
@Override	public void write(final char[] buf, int offset, int count) throws IOException {	}
编译可以通过。
二、具体原因
后来在stackoverflow查找相关原因的时候,发现以下解释:
Declaring a variable final can serve as useful documentation that its value will not change and can help avoid programming errors.
However, afinalmodifier on a method parameter is not mentioned in therules for matching signaturesof overridden methods, and it has no effect on the caller, only within the body of an implementation.
It can't be used to match signatures since it is does not appear in the actual .class file. It is for the compiler only.
具体来说,其实由于final修饰符只在当前实现函数中起作用,只是对编译器的一种提示,不会出现具体的.class文件中,而且无论参数是否final,java都只会进行pass by value的传参形式。说到底,final只是代表当前重载函数的具体实现,与接口无关,因此JSE规范里没有把这个列入函数签名中,属于具体实现细节。
三、其他可用修饰
这里稍微延伸一下,对于相同原理的还有synchronized关键字:
@Override	public synchronized void write(final char[] buf, int offset, int count) throws IOException {	}
即在重载函数里添加synchronized关键字同样是允许的,因为与final意义一样,是当前函数的具体实现,不影响接口声明。
至于对于声明里的异常抛出,则有不同规则,因为这会导致接口的实现的。
具体例子如下:
@Override	public synchronized void write(final char[] buf, int offset, int count) throws JSONException {	}
上面这个例子会导致编译失败,具体由于抛出里JSONException,比基类多抛出一个已经检查的异常。@Override	public synchronized void write(final char[] buf, int offset, int count) {	}有趣的是,上面这个例子编译可以通过,虽然比基类少声明里一个已经检查的异常。
不过这样做的确是合理的,因为实现接口的函数必然不能有比接口多的异常,否则会影响接口的使用。
另外还有对于修饰符不能低于接口的权限等等,也即接口是protected,实现函数就必须是protected以上的权限修饰。
四、详细资料
具体可以参考JSE的关于重载函数的要求:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.8.3
以及函数签名的解释:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.2
网上关于重载的说法很杂很乱,下面详细介绍一下什么是重载切记重载的定义:1.函数或者方法有相同的名称2.参数列表不相同注意,这里可没提到函数(方法)的修饰符和返回值,所以,只要满足以上两个条件,都可以说...博文来自: ItaLink
Java中重载方法的使用原则今天看到个有趣的问题,这里主要是针对重载方法中形参间是有继承关系的,在选择重载方法时按什么方式选择,问题如下:classTest3{publicstaticvoidmain...博文来自: 斗胆潇洒~
重载“两同一不同”:同一个类,同一个方法名,不同的参数列表。方法的重载与返回值无关!》构造方法也能重载重写(前提:在继承的基础之上,子类在获取父类的结构以后,可以对父类中重名的方法进行“重构”)方法的...博文来自: weixin_42610730的博客
1.访问修饰符访问修饰符本类同包子类其他private√默认(friendly)√√protected√√√public√√√√2.方法重写方法重写的规则:在继承关系的子类...博文来自: yuzhaocong的博客
众所周知,Java中方法重写的要求是方法签名完全相同。方法签名是指方法名+参数列表。而父类中或接口中的方法的时候重写方法的时候,除了方法签名完全相同之外,访问修饰符和返回值类型有什么限制吗?答案是肯定...博文来自: 充电控的博客
java中的native方法和修饰符(转)Java中的native修饰符今天偶然看代码,发现别人有这样写的方法,并且jar里面有几个dll文件,比较奇怪,于是把代码打开,发现如下写法。publ...博文来自: evilcry2012的专栏
回顾:1.内存管理:由JVM来管理1)堆:所有new出来的对象(包括成员变量)2)栈:正在调用的方法中的所有局部变量(包括参数)3)方法区:.class字节码文件(包括方法)2.继承:1)代码...博文来自: 我是菜鸟想上天的博客
final这个修饰词再java语言中并不陌生,我想大家平时在翻看平时的代码中经常看到,下面为大家总结final修饰符的用法,同时也给自己加深一下印象。	1.被final修饰的类不能被继承	在我们的印象...博文来自: boy_mey的博客
main方法的修饰1)通过改变修饰符的顺序,方法原型不改变。2)java数组可以使用后类型,前变量或后变量。3)通过传递3个点为main方法提供var-args支持4)有效的javamain方法签名5...博文来自: benhz的博客
我以前和你一样,对java中为什么不能根据返回值进行重载,而只能根据方法的参数进行重载非常不理解。在网上看到各种答案都不能完全的说服我,直到有一天突然就想通了。假设根据返回值可以进行方法重载,在类中写...博文来自: 君临天下
Java中的static修饰符十分常见,先谈谈关于修饰属性与方法时需要注意的。先来观察一段关于修饰属性的例子:classFruit{	privateStringname;//水果类型	privated...博文来自: qty4505861的博客
java中的方法和c中的函数很相似方法重载在同一个类中,方法名相同,参数类型或参数个数不同importjava.io.*;importjava.util.Scanner;publicclassMain...博文来自: cyh
Java中方法不能重载的三种情况1.对于两个方法,如果只有返回值不同,那么不构成重载,程序会报错。classA{publicvoidcry(){......}publicintcry(){return...博文来自: weixin_38205760的博客
java多态的2种表现形式方法重载和方法覆盖方法重载:同一个类中,方法名相同,参数列表不同的2个或多个方法构成方法的重载。方法覆盖:子类重新实现了父类中的方法。方法重载[java]viewplain...博文 Java 之道
方法重载的要求就是两同一不同:同一类中方法名相同,参数列表不同。至于方法的其他部分,如方法返回值类型、修饰符等,与方法重载没有任何关系。...博文来自: totally123的专栏
访问修饰符总结1.private2.默认3.protected4.publicprotected本类,同包,子类可以使用private只能在本类中使用默认只能在本类以及同包中使用public都可以使用...博文来自: paul1205的博客
java接口的修饰符:abstract(默认不写。interface本身就是抽象的,加不加abstract都一样)	接口中字段的修饰符:publicstaticfinal(默认不写)	解释如下:	...博文来自: Cheung's house
重载和重写的博客已经够多了,这里我们讨论一下他们的返回类型。重写:首先是类的不能存在两个完全相同构造方法(同时不能以返回类型来重载方法相信大家都是知道滴)类中的普通成员方法可以和构造方法重名(大小...博文来自: 死啦死啦滴的博客
转载自:http://www.iteye.com/topic/696221先看一道面试题:publicclassaClass{	voidfun(){	staticinti=0;	//局部变量前不能...博文来自: YTTCJJ的专栏