final方法
- 将方法定义为final,可以防止子类重写覆盖。同时定义为final的方法的执行效率,将远大于非final方法
- 如果一个方法被设置为private 那个这个方法就无法被子类(其他类)调用,自然无法重写,所以定义为private的方法被隐式的定义为final 因此无需将一个final的方法再修饰为private,否则还会有其他情况发生。
- final方法可以被子类继承。
public class Temp {
public static void main(String[] args) {
Student stu = new Student();
stu.study(); //学习
}
}
class Person{
String name;
int age;
final void study() {
System.out.println("学习");
}
}
class Student extends Person{
// public void study() { final修饰的方法不可以被重写
// // TODO Auto-generated method stub
//
// }
}
实例:
这里:重写必须满足一个条件:一个对象向上转型为它的基本类型并能调用相同方法
public class Test02 {
/**这里表面上子类的doit3方法覆盖了父类的doit3
* 但是重写必须满足一个条件:一个对象向上转型为它的基本类型并调用相同方法,*/
public static void main(String[] args) {
Child ch = new Child();
ch.doit1();
Father f = ch;
// f.doit1(); //报错 子类向上转型后无法调用doit1方法 说明子类的doit1只是新建了一个方法
f.doit2();
f.doit3();
}
}
class Father{
final private void doit1() {
System.out.println("父类doit1");
}
final void doit2() {
System.out.println("父类doit2");
}
void doit3() {
System.out.println("父类doit3");
}
}
class Child extends Father{
public final void doit1() {
System.out.println("子类doit1");
}
// final void doit2() { final方法不能被重写
// System.out.println("子类doit2");
// }
@Override
void doit3() {
System.out.println("子类doit3");
}
}
所以说明子类的doit1只是新建了一个方法。
final类
1.如果希望有个类不被继承,并且不允许其他人对这个类进行任何改动。可以将这个类的设置为final
2.final类中的方法都被隐式的设置为final形式,但是final类中的成员变量可以被定义为final或非final。
public class Test3 {
public static void main(String[] args) {
Temp1 tt = new Temp1();
System.out.println(tt.i); //4
System.out.println(tt.e); //88
tt.method1(); //方法1
tt.method2(); //方法2
}
}
final class Temp1{
int i = 4;
final int e = 88;
void method1() {
System.out.println("方法1");
}
final void method2() {
System.out.println("方法2");
}
}
final private 与继承重写的陷阱
1.当一个方法被定义为final的时候,在子类中无法被重写,但是由于子类继承了父类的所有方法属性(不能调用私有方法和构造方法),在子类中可以直接调用,在其他类创建该类对象后,也可以调用。
2.当一个方法被定义为private的时候,那个这个方法就无法被子类(其他类)调用,自然无法重写,所以定义为private的方法被隐式的定义为final
再来看private方法能否被重写
3.将方法定义为 private final ,则无法被子类重写,无法被子类调用,无法被其他类调用
将方法定义为private final,无法被子类重写。
无法被子类调用,无法被其他类调用
总结:
方法被final修饰:无法被重写,子类可以直接调用,其他类创建对象后可调用
方法被private修饰:无法被重写,子类无法调用,其他类也无法调用
方法被private final修饰:无法被重写,子类无法调用,其他也没法调用