JAVA 基础 final关键字
2016-03-21 23:44
706 查看
final关键字可以修饰类、方法和变量(包括局部变量和成员变量)
基本用法:
1. final 修饰类
表明这个类不能被继承,final类中的所有成员方法都会隐式的指定为final方法
2. final 修饰方法
表明该方法不能被子类覆盖,类的private方法会隐式的指定为final方法
3. final 修饰变量
对于final修饰的变量,如果是基本数据类型,则其数值一旦在初始化之后便不能更改,如果是引用类型的变量,则便不能再让其指向另一个对象
深入理解:
1. final变量和普通变量的区别:
当final作用于类的成员变量时,类的成员变量必需在定义时或者构造函数中进行初始化赋值,而且final变量一旦被初始化赋值,就不能再被赋值。
当final变量修饰基本数据类型以及String类型时,如果编译期间能知道它的确切值,则编译器会把它当做常量使用。也就是在用到该final变量的地方,相当于直接访问这个常量,不需要再运行时确定。
2. final修饰的引用变量指向的内容可变吗?
被final修饰的引用变量一旦初始化之后不能再指向其他引用,但是指向的对象内容是可变的。
3. final和static
static作用于成员变量用来表示只保存一份副本
final作用是用来保证变量不可变
基本用法:
1. final 修饰类
表明这个类不能被继承,final类中的所有成员方法都会隐式的指定为final方法
2. final 修饰方法
表明该方法不能被子类覆盖,类的private方法会隐式的指定为final方法
3. final 修饰变量
对于final修饰的变量,如果是基本数据类型,则其数值一旦在初始化之后便不能更改,如果是引用类型的变量,则便不能再让其指向另一个对象
深入理解:
1. final变量和普通变量的区别:
当final作用于类的成员变量时,类的成员变量必需在定义时或者构造函数中进行初始化赋值,而且final变量一旦被初始化赋值,就不能再被赋值。
当final变量修饰基本数据类型以及String类型时,如果编译期间能知道它的确切值,则编译器会把它当做常量使用。也就是在用到该final变量的地方,相当于直接访问这个常量,不需要再运行时确定。
2. final修饰的引用变量指向的内容可变吗?
被final修饰的引用变量一旦初始化之后不能再指向其他引用,但是指向的对象内容是可变的。
3. final和static
static作用于成员变量用来表示只保存一份副本
final作用是用来保证变量不可变
package com.cupdata.zicon.basic; public class FinalTest { private int i = 0; public final double m = Math.random(); public static double n = Math.random(); public static void main(String[] args) { testOne(); testTwo(); final FinalTest test = new FinalTest(); // final指向的对象不能变,但是对象内容可变 System.out.println(++test.i); // 1 FinalTest test1 = new FinalTest(); FinalTest test2 = new FinalTest(); /* final保证值不变,static表示只存一次的副本 */ System.out.println(test1.m); // 每次m的值都不相同,n的值一直不变 System.out.println(test1.n); System.out.println(test2.m); System.out.println(test2.n); FinalTest test3 = new FinalTest(); int i = 0; System.out.println("before: i=" + i);// 0 test3.changeValue(i); System.out.println("after: i=" + i);// 0 StringBuffer buffer = new StringBuffer("hello"); System.out.println("before: buffer=" + buffer.toString()); // hello test3.changeValue(buffer); System.out.println("after: buffer=" + buffer.toString()); // helloworld // -- // final并没有阻止buffer的值改变 } private void changeValue(StringBuffer buffer) { buffer.append("world"); /*对于引用各类型,传递的是引用的值,也就是让形参和实参指向了同一个对象*/ buffer = new StringBuffer("asdf"); //将buffer指向其他对象,并不影响主方法中的buffer System.out.println("change:" + buffer.toString()); } private void changeValue(int i2) { i2++; // java是值传递,相当于对变量进行了拷贝,修改i2的值并不会影响i的值 System.out.println("change: i2=" + i2); // 1 } private static void testOne() { String a = "hello2"; final String b = "hello"; // 在编译时已经知道确切值,则后面当作常量使用 String c = "hello"; String d = b + 2; String e = c + 2; System.out.println(a == d); // true System.out.println(a == e); // false } private static void testTwo() { String a = "hello2"; final String b = getHello(); // 编译时不能确定确切值 String c = b + 2; System.out.println(a == c); // false } private static String getHello() { return "hello"; } }
相关文章推荐
- Java对象的序列化和反序列化
- java基础学习02(简单的java程序)
- SpringBoot配置log4j输出日志
- 3.20 JAVA
- String.getBytes()& JAVA编码转换的详细过程
- java——基础02
- Java基础小结
- Java的心路历程——杂谈向
- spring mvc4使用及json 日期转换解决方案
- Myeclipse 快捷键设置和自动提示设置
- Spring 源码分析(四) ——MVC(一)Web 基础
- JDK和JRE的区别
- springmvc流程
- 最近使用spring4.0的Mvc,json请求时,客户端报错,406 Not Acceptable
- Java修饰符 abstract,static,final 的区别详解
- Java实现数据库的连接(1)------SQL Server 2008
- springMVC
- spring 定时器
- javaEE项目抽取BaseService及其注意事项
- JAVA学习笔记(二)