final关键字

Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。

在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。

final修饰变量

  • final修饰变量:该变量变成常量

对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

上面的一段代码中,对变量i和obj的重新赋值都报错了。

final修饰方法

  • final修饰方法:该方法不能被子类重写,但可以被重载!

如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。 
使用final方法的原因有二: 
    第一、把方法锁定,防止任何继承类修改它的意义和实现。 
    第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。

final修饰类

  • final修饰类:final修饰类则说明:这个类不能被继承!不能有子类。比如:String,Math.

Math类:

String类:

当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。

在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。

Final && Static

static和final一块用表示什么 ?
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”! 
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。 
对于方法,表示不可覆盖,并且可以通过类名直接访问。

总结

JAVA中final 与 static 总结
  final static
修饰类 该类不可被继承 只能修饰内部类,该类不需要new,是静态加载(嵌套顶层类)
修饰接口 × ×
修饰构造函数 × ×
修饰语句块 × 虚拟机按声明顺序初始化static成员字段和static语句块
修饰字段属性 表示属性初始化后不能修改(实例常量) 是类变量,所有实例共享该变量值(类变量)
在定义时或构造函数中赋值(每个实例拥有一份拷贝)
修饰方法 该方法不能被覆盖(只可继承) 是类方法,所有实例共享该方法(类方法)
修饰函数参数 参数值不能被函数修改 ×
修饰函数局部变量 局部变量初始化后不能修改(局部常量) ×
     
用途 1).为了防止方法被覆盖或改写; 1).定义全局变量或常量;
2).提高运行效率,JAVA对final方法调用采用内嵌机制; 2).定义类方法;
二、JAVA类加载顺序
JAVA类加载顺序: 1).按代码顺序递归加载静态成员/代码块,先父类再本类;
  2).按代码顺序递归加载非静态成员/代码块,先父类再本类;
  3).按代码顺序递归调用构造函数,先父类再本类;
   
JAVA类加载时机: 1).调用静态成员时,加载静态成员所在的类及父类;
  2).第一次new对象时加载(第二次new不再加载)
  3).加载子类会先加载父类.有static和final修饰的成员不会被加载;当成常量使用;

参考文章:

面向对象编程(七)——Static关键字

面向对象编程(十二)——final关键字的更多相关文章

  1. Javascript面向对象编程(二):构造函数的继承 作者:yuan一峰

    Javascript面向对象编程(二):构造函数的继承   作者: 阮一峰 日期: 2010年5月23日 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生 ...

  2. js面向对象编程(二)构造函数的继承(转载)

    Javascript面向对象编程(二):构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继 ...

  3. JavaScript 面向对象编程(二):继承

    Javascript面向对象编程(二):构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继 ...

  4. 【Java学习笔记之二十】final关键字在Java继承中的用法小结

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...

  5. 面向对象编程(十)——继承之Super关键字及内存分析

    Super关键字

  6. JavaScript面向对象编程(二)构造函数和类

    new关键字和构造函数 在文章JavaScript面向对象编程(一)原型与继承中讨论啦JavaScript中原型的概念,并且提到了new关键字和构造函数.利用new关键字构造对象的实例代码如下: // ...

  7. python 面向对象编程(二)

    在上一篇文章中谈到了类的基本定义和使用方法,这只体现了面向对象编程的三大特点之一:封装. 下面就来了解一下另外两大特征:继承和多态. 在Python中,如果需要的话,可以让一个类去继承一个类,被继承的 ...

  8. Python学习之==>面向对象编程(二)

    一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...

  9. javascript 学习笔记之面向对象编程(二):继承&多态

    ~~接上篇~~上一篇实现了类的实现以及类成员变量和方法的定义,下面我们来了解下面向对象中两个最重要的特性:继承和多态. 继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属 ...

随机推荐

  1. Task Scheduler Error and Success Constants (Windows)

    If an error occurs, the Task Scheduler APIs can return one of the following error codes as an HRESUL ...

  2. 浅谈RAID写惩罚(Write Penalty)与IOPS计算

    介绍 通常在讨论不同RAID保护类型的性能的时候,结论都会是RAID-1提供比较好的读写性能,RAID-5读性能不错,但是写入性能就不如RAID-1,RAID-6保护级别更高,但写性能相对更加差,RA ...

  3. 提取安卓手机的recovery

    一直都是从网上下载的recovery文件安装到手机.至于这个小小的recovery到底是什么全然不知.能不能自己做一个recovery呢?因为功能比较多的clockworkmod(简称cmw)的官网上 ...

  4. python实现查找指定文件

    若不包含子目录的遍历: import glob for filename in glob.glob("/data/testdata/*.jpg"): print filename ...

  5. Configuration.ConfigurationSettings.AppSettings已过时

    1.在项目中引用System.Configuration.dll,在需要的页面加上using System.Configuration; 2.把ConfigurationSettings.AppSet ...

  6. nginx gzip 模块配置

    #gzip模块设置 gzip on; #开启gzip压缩输出 gzip_min_length 1k; #最小压缩文件大小 gzip_buffers 4 16k; #压缩缓冲区 gzip_http_ve ...

  7. php thread

    1-include('w_fun.php');页面已经在执行,则修改include中的函数,倒置旧页面不受影响:新页面生效:2-time  轮流 echo ' <script> windo ...

  8. Tomcat7 安装StartSSL证书笔记

    1.Tomcat-Native安装 使用StartSSL,Tomcat必须用apr方式启动(apr方式对于静态的内容,比默认的bio效率要高很多倍) Windows下tomcat-native安装 直 ...

  9. 十 mybatis逆向工程

    1       逆向工程 1.1     什么是逆向工程 mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper. ...

  10. Super不要在Super构造器中调用覆盖方法

    import java.util.Date; public class Super{ public Super(){ System."); overrideMe(); System.&quo ...