javase-final

一.final关键字的好处

1.final关键字提高了性能。JVM和Java应用都会缓存final变量。

2.final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。

3.使用final关键字,JVM会对方法、变量及类进行优化。

二.final修饰属性

1.final修饰的属性表示不可改变

2.final修饰类对象表示该引用不能改变,但其内容是可以改变的

3. final修饰数组与修饰类对象相同,表示该引用不能改变,但其内容是可以改变的

4.final修饰的属性必须赋值    可以在构造方法中赋值,因为构造方法一定会被调用,所以一定会赋值,不能在普通方法中赋值。


/**
 * date:2017年4月17日16:45:04
 * target:final修饰数据。
 * @author ypy
 */
public class Final_1{
	public static void main(String[] args) {
		FinalData f1 = new FinalData();
		FinalData f2 = new FinalData();
		//f1.i1++;   错误,final修饰的属性表示不可改变的
		System.out.println("f1:i3=" + f1.i3 + ",i4=" + f1.i4);//f1和f2的i4值相同,体现了static的特性
		System.out.println("f2:i3=" + f2.i3 + ",i4=" + f2.i4);
		
		f1.v1.i++;
		f1.v2.i++;
		f1.v1 = new Value();
		//f1.v2 = new Value();  final修饰类对象表示该引用不能改变,但其内容是可以改变的
		
		for (int i=0; i<f1.a.length; i++) {
			f1.a[i]++;
			System.out.println(f1.a[i]);
		}
		int[] b = {1,2,3};
		//f1.a = b;       final修饰数组与修饰类对象相同,表示该引用不能改变,但其内容是可以改变的
	}
}

class Value {
	int i = 1;
}

class FinalData {
	//基本数据类型作为编译期的常数
	final int i1 = 2;
	static final int I2 = 5;   //注意对于含有固定初始化值(即编译期常数)的 fianl static基本数据类型,它们的名字根据规则要全部采用大写。
	
	//基本数据类型作为运行期的常数,所以不是final修饰的属性就一定会在编译期赋值
	final int i3 = (int) (Math.random()*20);
	static final int i4 = (int) (Math.random()*20);
	
	//非基本数据类型
	Value v1 = new Value();
	final Value v2 = new Value();
	
	//final int i5;  final修饰的属性必须赋值    可以在构造方法中赋值,因为构造方法一定会被调用,所以一定会赋值
	//				  不能在普通方法中赋值,因为普通方法不一定会被调用,所以不一定会被赋值
	//final Value v3;
	
	//数组
	final int[] a = {1,2,3,4,5};
}
/*
 ***************jdk1.8运行结果*************** 
f1:i3=10,i4=7
f2:i3=15,i4=7
2
3
4
5
6
 */


三.final修饰方法

1.final修饰的方法可以被继承,但不能被重写。
2.构造方法不能用final修饰,因为构造方法不能被继承,用final修饰方法的目的是不允许被重写,所以final修饰构造方法没有意义。
/**
 * date:2017年4月17日17:11:59
 * target:final修饰方法。
 * @author ypy
 * conclusion:
 *     一:为什么用final修饰方法?
 *           1.为方法“上锁”,防止任何继承类改变它的本来含义。
 *           2.将一个方法设成 final后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。
 *             只要编译器发现一个final 方法调用,就会(根据它自己的判断)忽略为执行方法调用机制而采取的常规代码插入方法(将自变量压入堆栈;跳至方法代码并执行它;跳回来;清除堆栈自变量;最后对返回值进行处理)。
 *             相反,它会用方法主体内实际代码的一个副本来替换方法调用。这样做可避免方法调用时的系统开销。
 *     二:什么时候用final修饰方法?
 *           通常,只有在方法的代码量非常少,或者想明确禁止方法被覆盖的时候,才应考虑将一个方法设为final。
 */
public class Final_2{
	public static void main(String[] args) {

	}
}

class FinalMethod {
//	final FinalMethod() {   构造方法不能用final修饰,因为final修饰的方法不能被子类重写,隐含可以被继承,但构造方法是不能被子类继承的。
//		
//	}
	final void m() {
		
	}
}

class A extends FinalMethod {
//	void m() {    final修饰的方法不能被重写
//		
//	}
}
/*
 ***************jdk1.8运行结果*************** 
 */


四.final修饰类

1.final修饰的类不允许继承,其内部的方法都默认被final修饰。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值