一、final 修饰变量,被final修饰的变量在被赋初始值之后,不能对它重新赋值

  修饰实例变量,必须显示指定初始值,可以在三个位置指定初始值:
        1、定义final实例变量时指定初始值
        2、在非静态初始化块中为final变量指定初始值
        3、在构造器中为final实例变量指定初始值
    对于final实例变量,这三种方式都会被抽取到构造器中赋初始值
 
  修饰类变量,同样必须显示指定初始值,可以在两个位置指定初始值:
        1、定义类变量时指定初始值
        2、在静态初始化块中为final类变量指定初始值
    这两种方式都会被抽取到静态初始化块中赋初始值
public class FinalVar {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Price.INSTANCE.currentPrice);
Price price=new Price(2.8);
System.out.println(price.currentPrice);
}
}
class Price{
static Price INSTANCE=new Price(2.8);
static double initPrice=20;
/*
* 若调整 上面两句话的顺序
* 则结果改为 17.2 17.2
*/ double currentPrice;
public Price(double discount) {
// TODO Auto-generated constructor stub
currentPrice=initPrice-discount;
} } -2.8
17.2
public class FinalVar {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Price.INSTANCE.currentPrice);
Price price=new Price(2.8);
System.out.println(price.currentPrice);
}
}
class Price{
final static Price INSTANCE=new Price(2.8);
final static double initPrice=20;
double currentPrice;
public Price(double discount) {
// TODO Auto-generated constructor stub
currentPrice=initPrice-discount;
} } 17.2
17.2

二、执行“宏替换”的变量

 
   final 修饰符的一个重要用途是定义“宏变量”,当定义final变量时就为该变量指定了初始值,而且该初始值可以在编译时确定下来,那这个final变量本质上就是一个“宏变量”,编译器会把程序中所有用到该变量的地方直接替换成该变量的值。
    
    如果没有使用final修饰变量a,则系统会把它当做一个变量来处理,不会进行替换,如s0==s1 false, sf0==sf1 true ;
    即使字符串连接运算中包含隐式类型(将数字转换为字符串)转换,字符串依然在编译时就可以确定该变量的值,因此他们都是宏变量,如s1==s3 true sf1==sf3 true,。
    如果连接字符串中包含需要调用String类的方法,因此编译器无法在编译时候确定它的值,即使用final 修饰,也不会被当做宏变量处理 如s1==s2 false  sf1==sf2 false。
    虽然对于实例变量而言,除了可以在定义该变量使赋初始值之外,还可以在非静态初始化块、构造器中对它赋初始值,但对于final 实力变量而言,只有在定义该变量时指定初始值才会有“宏变量”的效果,在非静态初始化块、构造器中为final实例变量指定初始值则不会有这种效果,如str1+str1=="javajava" false,str2+str2=="javajava" false,str3+str3=="javajava" true。
    对于类变量而言,也只有在定义final类变量时制定初始值,系统才会对该final类变量执行宏替换str11+str11=="javajava" false,str12+str12=="javajava" true。
 
public class FinalDefine {
String s00="java";
String s01="1"; String s0=s00+s01;
String s1="java1";
String s2="java"+String.valueOf(1);
String s3="java"+1; final String sf00="java";
final String sf01="1";
String sf0=sf00+sf01;
final String sf1="java1";
final String sf2="java"+String.valueOf(1);
final String sf3="java"+1; final String str1;
final String str2;
final String str3="java";
{
str1="java";
}
public FinalDefine(){
str2="java";
} final static String str11;
final static String str12="java"; static {
str11="java";
} void charge(){ System.out.println(s0==s1);
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(str1+str1=="javajava");
System.out.println(str2+str2=="javajava");
System.out.println(str3+str3=="javajava"); System.out.println(); System.out.println(sf0==sf1);
System.out.println(sf1==sf2);
System.out.println(sf1==sf3);
System.out.println(str11+str11=="javajava");
System.out.println(str12+str12=="javajava");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
FinalDefine fDefine=new FinalDefine();
fDefine.charge();
} } false
false
true
false
false
true true
false
true
false
true

JavaSE——final修饰符的更多相关文章

  1. Java final 修饰符知识点总结

    final从字面上理解含义为“最后的,最终的”.在Java中也同样表示出此种含义. final可以用来修饰变量(包括类属性.对象属性.局部变量和形参).方法(包括类方法和对象方法)和类. 1. fin ...

  2. Java中的final修饰符

    1.什么时候可以选择final修饰符 如果想让一个类不被其他类继承,不允许在有子类,这时候就要考虑用到final来修饰. 2.用final修饰的类 首先大家要明白,用final修饰的类是不能被继承的, ...

  3. 对于形式参数只能用final修饰符,其它任何修饰符都会引起编译器错误

    在Java中修饰符总共有一下几种: 1.访问控制修饰符    分别有:public private protected,缺省 2.其它修饰符      分别有:abstract,final,stati ...

  4. private static final 修饰符

    java修饰符分类修饰符字段修饰符方法修饰符根据功能同主要分下几种 1.权限访问修饰符 public,protected,default,private,四种级别修饰符都用来修饰类.方法和字段 包外 ...

  5. 类成员(static)和final修饰符

    在Java类里只能包含成员变量.方法.构造器.初始化块.内部类(包括接口.枚举)5种成员,类成员是用static来修饰的,其属于整个类. 当使用实例来访问类成员时,实际上依然是委托给该类来访问类成员, ...

  6. JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配

    Java栈与堆 堆:顺序随意 栈:后进先出(Last-in/First-Out). Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new.newarray.anewarray和mu ...

  7. as3 中 final 修饰符

    现在,在ActionScript 3.0的修饰符中,只有final修饰符没有介绍.之所有放在这里介绍,是因为final修饰符只与继承有关,指定一个方法不能被重写或一个类不能被继承. 一般来说,当用fi ...

  8. final修饰符:

    知识点: 1.final关键字用于修饰类.变量和方法 2.有点类似C#里的 sealed 关键字,用于表示它修饰的方法.变量和类不可以再被改变 3.final修饰变量时,表示该变量一旦获取了初始值,就 ...

  9. Java中final修饰符深入研究

    一.开篇 本博客来自:http://www.cnblogs.com/yuananyun/ final修饰符是Java中比较简单常用的修饰符,同时也是一个被"误解"较多的修饰符.对很 ...

随机推荐

  1. EF+mvc+mysql

    这个真是一个大坑啊.TM折腾了一下午终于弄好了.赶紧记录下来分享给大家,免得有和我一样一直配置不成功的又折腾半天….1.安装MySQL for Visual Studio这个直接在mysql官网下载并 ...

  2. WebApi访问方式配置

    之前公司使用webapi开发项目,只知道怎么用对于怎么配置一直不了解,最近这段时间没什么事然后自己建一个webapi项目,只知道怎么用对于怎么配置一直不了解,最近这段时间没什么事然后自己建一个weba ...

  3. c# 基础字符串

    ToLower():得到字符串的小写形式.注意字符串是不可变的,所以这些函数都不会直接改变字符串的内容,而是把修改后的字符串的值通过函数返回值的形式返回.s.ToLower()与s=s.ToLower ...

  4. cf519D. A and B and Interesting Substrings(前缀和)

    题意 给出$26$个字母对应的权值和一个字符串 问满足以下条件的子串有多少 首尾字母相同 中间字母权值相加为0 Sol 我们要找到区间满足$sum[i] - sum[j] = 0$ $sum[i] = ...

  5. 帝国empirecms后台登陆次数限制修改

    打开文件:\e\config\config.php, 找到 'loginnum'=>5, 把5改为自己想要的数字即可

  6. C语言中的static和extern

    c语言中,全局变量是一个非常重要的概念.全局变量定义在函数外,可以被所有的函数共同使用. #include <iostream> ; void display() { printf(&qu ...

  7. HoloLens | 世界的每一次变化,其实都提前打好了招呼

    新年,对灯发誓——不说老话,说新鲜事. 佛经上说:世间唯一永恒不变的,就是永远在变化. 130年前(说好的不说老话呢),世界上第一辆汽车在德国发出第一声轰鸣,世界变了: 现在,汽车已遍及世界,颜值.性 ...

  8. UVA 12171 (hdu 2771)sculptrue(离散化)

    以前对离散化的理解不够,所以把端点和区间区分来考虑但是做完这题以后有了新的认识: 先来看一个问题:给你以下的网格,你需要多少空间去存储红点区间的信息呢? 只需要图上所示的1,2,3,4个点就足够表示红 ...

  9. fork新建进程

    #include <sys/types.h>#include<sys/wait.h>#include<unistd.h>#include<stdio.h> ...

  10. k8s1.13.0二进制部署-master节点(三)

    部署apiserver 创建生成CSR的JSON配置文件 [root@k8s-master1 ssl]# vim kubernetes-csr.json { "CN": " ...