您的位置:首页 > 编程语言 > Java开发

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作用是用来保证变量不可变

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";
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: