20180319 java java面向对象-final类和final方法
为什么需要使用final修饰符:
在继承关系中,最大的弊端是破坏封装,子类能访问父类的实现细节,而且可以通过方法覆盖的形式修改实现细节。
现在想办法让子类只可以调用父类数据,不可以修改父类数据,final修饰符就是解决这个问题的。
多个修饰符之间是没有先后排列关系的。可以写成如下形式:
public static final
或
public final static
final本身的含义是“最终的,不可改变的”,它可以修饰非抽象类、非抽象方法和变量,注意:构造方法不能使用final修饰,因为构造方法不能被继承,肯定是最终的。
1、final修饰的类:表示最终类,表示该类不能再有子类。
eg:
final class SuperClass
{
}
class SubClass extends SuperClass
{
}
class FinalDemo
{
public static void main(String[] args)
{
System.out.println("hello");
}
}
此程序会编译报错,因为父类被final修饰了,而子类却继承了父类。
只要满足以下条件就可以把一个类设计成final类:
(1)某类不是专门为继承而设计的;
(2)出于安全考虑,类的实现细节不需改动(不准修改源代码);
(3)确信该类不会再被拓展。
java里final修饰的类很多,比如8大基本数据类型包装类和String类。
2、final修饰的方法:即最终的方法,该方法不能被子类覆盖。
eg:
class SuperClass
{
final public void doWork();
}
class SubClass extends SuperClass
{
public void doWork();
}
class FinalDemo
{
public static void main(String[] args)
{
System.out.println("hello");
}
}
此程序会编译报错,因为子类不能覆盖被final修饰的父类方法。
什么时候的方法使用final修饰:
(1)在父类中提供的统一的算法或算法骨架,就不准子类通过方法覆盖来修改,此时需要使用final修饰。
(2)在构造器中调用的方法,即初始化方法,初始化方法一般使用final修饰,这也是怕被子类覆盖。
注意:final修饰的方法子类可以调用,但是不能覆盖。
3、final修饰的变量: