Java final修饰符使用总结
2015-12-05 19:32
411 查看
总:final修饰符可以修饰变量、方法、类。
一:final修饰的成员变量。
final修饰的成员变量被赋初始值后,就不可以再次被赋值。
java规定final修饰的成员变量必须显示初始化。类变量是在类准备阶段被系统分配内存,并赋默认值,在初始化阶段为类变量进行初始化,赋初始值。实例变量是通过new关键字调用构造器时创建一个实例,系统为实例的实例变量分配内存,并赋默认值,然后执行初始化,并赋初始值。当类变量或实例变量没有初始化语句时,成员变量的值只是默认值,根据成员变量的类型,成员变量的值可能是null或者0等,这样final变量就没有任何意义。
类变量的初始化语句是定义这个变量时给定的初始值或在静态代码块中执行类变量的初始化,所以final修饰的类变量必须在定义这个变量时,或者静态代码中显示初始化。
实例变量的初始化语句时定义这个变量时给定初始值或在普通初始化块、构造器中执初始化,所以fianl修饰的变量初始化必须在定义这个变量时制定初始值或着在普通初始化块、构造器中显示初始化。
代码演示:
[align=left][/align]
二:final修饰的局部变量
局部变量原本就必须要显示初始化,形参除外,final修饰的局部变量也是这样。局部变量必须显示初始化,可以在定义的时候不指定初始值,在局部变量范围类再制定初始值,当还没制定初始值时,不可以使用局部变量,final修饰的局部变量也是如此。final修饰的形参不可以被赋值,因为形参是根据传入的值由系统初始化;
代码演示:
[align=left][/align]
[align=left][/align]
[align=left]三:final修饰的引用类型变量[/align]
[align=left]final修饰的引用类型变量,保存的是实例的地址,实例地址不可以改变,但是对象的状态信息可以改变。[/align]
[align=left]代码演示:[/align]
[align=left][/align]
[align=left][/align]
[align=left]四:宏变量[/align]
[align=left]定义final修饰的变量时直接指定初始值,在编译期间可以确定初始值,就是宏变量,系统在编译期间会将后面程序用到这个宏变量的地方全部替换成该变量的值。[/align]
[align=left]编译期可以确定初始值的条件:1:定义这个final变量时值是直接量。2:定义final变量时指定的初始值时表达式,这个表达式是基本算术表达式或字符串连接运算,不访问基本变量和方法。[/align]
[align=left]代码演示:[/align]
[align=left][/align]
[align=left]五:final修饰的方法[/align]
[align=left]final修饰的方法不可被重写[/align]
[align=left]代码演示:[/align]
[align=left][/align]
[align=left][/align]
[align=left]六:final修饰的类不可被继承[/align]
[align=left]例如:java.lang.Math java.lang.String [/align]
一:final修饰的成员变量。
final修饰的成员变量被赋初始值后,就不可以再次被赋值。
java规定final修饰的成员变量必须显示初始化。类变量是在类准备阶段被系统分配内存,并赋默认值,在初始化阶段为类变量进行初始化,赋初始值。实例变量是通过new关键字调用构造器时创建一个实例,系统为实例的实例变量分配内存,并赋默认值,然后执行初始化,并赋初始值。当类变量或实例变量没有初始化语句时,成员变量的值只是默认值,根据成员变量的类型,成员变量的值可能是null或者0等,这样final变量就没有任何意义。
类变量的初始化语句是定义这个变量时给定的初始值或在静态代码块中执行类变量的初始化,所以final修饰的类变量必须在定义这个变量时,或者静态代码中显示初始化。
实例变量的初始化语句时定义这个变量时给定初始值或在普通初始化块、构造器中执初始化,所以fianl修饰的变量初始化必须在定义这个变量时制定初始值或着在普通初始化块、构造器中显示初始化。
代码演示:
[align=left][/align]
public class Test { // 定义变量时制定初始化值 final String f = "你好"; static final String w = "大家好" ; // final修饰的变量必须显示初始化 static final int a; final int b ; final int c ; // 在静态代码块中初始化 static { a = 100; // 静态代码块中不能初始化实例变量 // b=15; } // 在普通代码块中初始化 { b = 100; } // 在构造器中初始化 public Test( int c) { this.c = c; } // 成员变量只能在以上几个地方执行初始化,所以final修饰的变量只能在这几个地方初始化 // 初始化结束,这些语句将不会再执行 public static void main(String args[]) { // final修饰的变量第一次被赋初始值后,不可以再改变 // 为final变量再次赋值,将出现错误。 // Test.a=1000; Test test = new Test(80); System. out.println(test.c ); // 为final修饰的实例变量再次赋值,将出现错误 // test.c=60; } }
二:final修饰的局部变量
局部变量原本就必须要显示初始化,形参除外,final修饰的局部变量也是这样。局部变量必须显示初始化,可以在定义的时候不指定初始值,在局部变量范围类再制定初始值,当还没制定初始值时,不可以使用局部变量,final修饰的局部变量也是如此。final修饰的形参不可以被赋值,因为形参是根据传入的值由系统初始化;
代码演示:
[align=left][/align]
public class Test { int a; // final修饰的形参不可被赋值 public Test( final int a) { // final修饰的形参不可以被赋值,由系统根据传入的参数由系统初始化 // a=5; } public void test() { { // final修饰的局部变量可以不再定义局部变量时制定初始值 final int c; // final修饰的局部变量还没有指定初始值时不可以使用出现错误 // System.out.println(c); c = 100; // 赋初始值后不可以在赋值,否则将出现错误 // c=200; } } }
[align=left][/align]
[align=left]三:final修饰的引用类型变量[/align]
[align=left]final修饰的引用类型变量,保存的是实例的地址,实例地址不可以改变,但是对象的状态信息可以改变。[/align]
[align=left]代码演示:[/align]
[align=left][/align]
class Person { int a = 10; } public class TestOne { int a = 10; // 定义一个final修饰的Person实例 final Person p = new Person(); public static void main(String args[]) { TestOne test = new TestOne(); // final修饰的实例是引用类型变量p,保存的是地址,所以地址不可以改变,出现错误。 // test.p=new Person(); // final修饰的实例是引用类型变量p,保存的是地址,地址不可以改变,实例的状态信息可以改变 // 输出final修饰的实例,引用类型变量p的状态信息a,输出10 System. out.println(test.p .a ); // 改变p的状态信息 test. p. a = 100; // 输出a,发现状态信息变啦 System. out.println(test.p .a ); } }
[align=left][/align]
[align=left]四:宏变量[/align]
[align=left]定义final修饰的变量时直接指定初始值,在编译期间可以确定初始值,就是宏变量,系统在编译期间会将后面程序用到这个宏变量的地方全部替换成该变量的值。[/align]
[align=left]编译期可以确定初始值的条件:1:定义这个final变量时值是直接量。2:定义final变量时指定的初始值时表达式,这个表达式是基本算术表达式或字符串连接运算,不访问基本变量和方法。[/align]
[align=left]代码演示:[/align]
[align=left][/align]
public class TestTwo { public static void main(String args[]) { // 初始值为直接量则为宏变量 final int a = 10; // 字符串连接运算的值可以在编译期确定,为宏变量 final String w = "" + "" ; // 基本算术表达式的值可以在编译期确定,为宏变量 final int b = 5 + 4; // 隐式调用方法不影响编译期得到值,这个String字符串会被存到常量池, // 当后面程序再次使用到这个字符串,会直接引用常量池中这个字符串 final String f = "" + 5; // 下面用String变量证明一下 String g = "5"; System. out.println(f == g); } }
[align=left]五:final修饰的方法[/align]
[align=left]final修饰的方法不可被重写[/align]
[align=left]代码演示:[/align]
[align=left][/align]
class Father { // 父类中被final修饰的方法 public final void test() { } } public class Son extends Father { // final修饰的方法不可以被重写,重写出现错误 // public void test(){ // } }
[align=left][/align]
[align=left]六:final修饰的类不可被继承[/align]
[align=left]例如:java.lang.Math java.lang.String [/align]
相关文章推荐
- JavaWeb 利用springsecurity做用户权限限制
- spring security 简单登陆(二)
- Java Threads and the Concurrency Utilities 《读书笔记》
- java反射机制详解
- 简单的JDBC应用,java连接 MYsql;
- java第六天
- Java内部类、静态类、局部类详解
- Java中System.getenv()和System.getProperties()的区别
- Windows系统配置Java Web开发环境Step by Step
- java中的集合框架
- LeetCode 7 : Reverse Integer (Java)
- struts2 action 前端 iterator 标签遍历 map, list, array 数组
- eclipse中删除所有的空行
- 深入浅出java虚拟机系列:(一)jvm 内存区域
- java 基础(异常处理)
- Java API —— Pattern类
- Java IO(输入输出流)
- 第一章 Java多线程技能
- [Java 基础] 使用java.util.zip包压缩和解压缩文件
- Day 30: Play Framework —— Java开发者的梦想框架