1. final关键字作用于函数上时:
早期的final作用在函数上时,编译器将这种函数的调用转为内嵌的调用,当前只有在想要明确禁止函数覆盖时,才使用final。
类中所有的private方法都隐式地制定为final的。
package com.naruto.chapter7.finaltest;
import static net.mindview.util.Print.*;
public class finalmethodtest {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
class WithFinals {
public WithFinals() {
}
private void fun11() {
print("fun1 in class WithFinals");
}
public final void fun12() {
print("fun12 in class WithFinals");
}
private void fun13() {
print("fun13 in class WithFinals");
}
protected void fun2() {
print("fun2 in class WithFinals");
}
protected void fun3() {
print("fun3 in class WithFinals");
}
public void fun4() {
print("fun4 in class WithFinals");
}
public int fun5() {
print("fun5 in class WithFinals will return 5");
return 5;
}
}
class FinalTest extends WithFinals {
public FinalTest() {
}
private int fun11() {
print("fun1 in class FinalTest");
return 0;
}
//public final void fun12() {
// print("fun1 in class WithFinals");
//}
public final void fun12(int i) {
print("fun1 in class WithFinals");
}
private void fun13() {
print("fun13 in class WithFinals");
}
public void fun2() {
print("fun2 in class WithFinals");
}
/**
* Cannot reduce the visibility of the inherited method from WithFinals.
*/
protected void fun3() {
super.fun3();
print("fun3 in class FinalTest");
}
/**
* Cannot reduce the visibility of the inherited method from WithFinals
*/
public void fun4() {
print("fun4 in class FinalTest");
}
public int fun5() {
print("fun5 in class FinalTest will return 55");
return 55;
}
}
从函数fun11()可以同时存在于两个类且仅有返回参数不同可以看出,子类FinalTest中的fun11()并不是对父类WithFinals类的重写。private的函数自带final属性,无法重写,但是区别是final修饰的函数无法重写,可以重载。private修饰的函数在子类中完全不可见,隐藏了内部实现,体现为不是重写,不是重载。