final修饰符

final可用于修饰类,变量和方法,用final修饰的类,变量,方法不可改变。

final修饰的成员变量不能做第二次赋值,final修饰的成员变量必须有明确的初值,若没有初值程序将编译错误,可以直接在声明该变量的地方赋初值,也可以在(静态)初始化块中赋初值,还可以在构造器中指定初值(类变量不行);final修饰的局部变量可以在后面的代码中赋初值,但也只能赋值一次,而且不能对final修饰的形参赋初值。final修饰的引用类型变量不能重新赋值,但可以改变引用类型变量所引用对象的内容。eg;

class finalVar
{
	public int s;
	public finalVar(int s) {
		this.s = s;
	}
	
	public final void var(final String s)//s只能由对象类的对象赋值,自己不嫩为自己赋值
	{
		System.out.println(s);
	}
}

public class finalVariable {
	final static int a = 1;
	final static int b;
	static
	{
		b =2;//使用静态初始化块初始化变量
	}
	/*
	 * final static int c;
	 * c =3;是错误的//不能先定义final(静态)变量,再赋初值
	 */
	final double c;
	public finalVariable()
	{
		c = 1.2;//使用构造器初始化变量
	}
	
	public static void main(String[] args)
	{
		final finalVar var = new finalVar(1);
		var.s = 2;//改变引用变量所引用对象的值
		var.var("引用变量");
	}
}

final修饰符可以定义“宏变量”,被final修饰的指定了确定初值的的变量可以近似的看做“宏变量”,这种变换就是"宏替换":eg:

public class finalVar
{
	public static void main(String[] args)
	{
		String str0 = "ab";
		String str1 = "a" + "b";
		System.out.println("str1 = str0 is " + (str1 == str0));

		String str11 = "a";
		String str12 = "b";
		String str13 = str11 + str12;
		System.out.println("str13 = str0 is " + (str13 == str0));

		final String str21 = "a";
		final String str22 = "b";
		final String str23 = str21 + str22;
		System.out.println("str23 = str0 is " + (str23 == str0));
	}
}

结果为:

str1 = str0 is true

str1 = str0 is false

str1 = str0 is true

str0使常量池缓存“ab”,str1使是变量str1指向常量池中的“ab”,所以str1 = str0,但str13 = str11 + str12;不能使str13指向常量池,所以str13 != str0;str21,str22进行了“宏替换”,可以作为常量,既str23与str1类似。


 final修饰的方法不可被重写,可以被重载。

final修饰的类不能有子类,例如java.lang.Math类就不能有子类。

在不可变类中,类实例的实例变量不可改变,因此在创建不可变类时要用到final和private修饰符来修饰成员变量。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值