java中final修饰符的使用

首先为什么要用final修饰符呢?

因为面向对象编程的一大特点是继承关系。

但是继承关系又会破坏代码的封装性(子类可以访问父类并修改父类的实现细节)

比如如下代码


//新建一个Animal类
class Animal
{
    public void eat() 
    {           System.out.pintln("正在执行吃的方法...");
   }

}

//新建一个Animal的子类Dog类
class Dog extends Animal
{
    public void eat()
    {
          System.out.println("吃骨头...");
    }
}

class AnimalDemo
{
     public static void main(String[] args)
   {
     Animal d=new Dog();
     d.eat();
    }
}


运行结果如图所示,子类Dog类重写了父类Animal类的eat方法,所以执行时执行的是子类的方法

如果父类中的方法被子类改动会造成严重后果的话整个程序就会出现问题,于是我们引出了final修饰符。






final修饰符:final修饰符可以修饰方法,类和变量。(final无法修饰构造器,因为构造器本身就不会被继承)

final修饰的类:final修饰的类称为最终类,不可以被继承,不能再有子类

用final修饰类的情况:

(1)某类不是为继承而设计

(2)出于安全考虑,不允许访问并修改实现细节

(3)确信该类不会再拓展




final修饰的方法:final修饰的方法就是不可以被子类重写的方法。

用final修饰方法的情况:

(1)在父类中提供算法的骨架,不许子类通过重写修改

(2)在构造器中调用的方法(初始化方法)一般用final修饰

注意:final类和final方法不可以共存(虽然编译器不会报错,但是这么做没有意义,final类已经无法被继承就不用考虑被子类重写了)




final修饰的变量:final是唯一可以修饰局部变量的修饰符,final修饰的变量即为常量(不可以被改变的量),用final修饰的变量必须经过显式初始化(一旦经过初始化操作后就不可以被改变)。

常量:

(1).字面量(直接给出的值)直接量

(2).final修饰的常量:一旦赋值就不能重新赋值


常量的命名规范:全部使用大写,若由多个单词组成则之间加下划线。

全局静态常量:放在一个类中的public static final的量




final修饰的引用类型变量的指向关系不可以被改变,比如如下代码会报错

//新建一个Demo类
class Demo
{
   private String name;
   public static void main(String[] args)
   {
           final Demo  s1=new Demo();
           final Demo  s2=new Demo();
           s1.name="java";
           s2=s1;
           System.out.println(s2.name);
   }

}


运行结果如上图所示。



所以,用final修饰的引用变量的指向关系不可以被改变