java基础语法之final关键字

java基础语法之final关键字


1、final关键字的含义。

Java关键字final有“无法改变的”、“最终的”等含义。可以修饰类,方法和成员变量。

final修饰的类不能被继承。(网上部分文章有结论:final类中的方法默认是final的。我不知道是怎么得出来的,但是感觉不对,写了个方法测试了下,证明结论是错误的。)

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;


public final class FinalDemo
{
	public void normalMethod(){}
	public final void finalMethod(){}
	public static void main(String[] args)
	{
		try
		{
			Method normalMethod = FinalDemo.class.getMethod("normalMethod", null);
			Method finalMethod = FinalDemo.class.getMethod("finalMethod", null);
			System.out.println(Modifier.toString(normalMethod.getModifiers()));
			System.out.println(Modifier.toString(finalMethod.getModifiers()));
		}
		catch (NoSuchMethodException | SecurityException e)
		{
			e.printStackTrace();
		}
	}
}

输出结果:

public
public final

final方法不能被子类的方法覆盖。(网上有结论说final方法不能被子类方法覆盖,但是可以被继承,可以被继承应该是和final无关的,而是和方法的访问修饰符有关,例如public、private、protected,试想private final的那是肯定无法继承到子类的。)


final成员变量表示常量,只能被赋值一次。(网上很多说法是赋值后值不再改变,其实这种说法不准确,被final修饰的值,如果是基本类型,那么值不可变,如果是对象,则是引用不可变,对象的内容是可以改变的。)

public class TestDemo
{

	public static void main(String[] args)
	{
		final StringBuilder sb = new StringBuilder("hello");
		sb.append(" world");
		System.out.println(sb.toString());
	}
}

还有一种说法:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。我就搞不懂了,final确实是禁止覆盖的意思,但是不能覆盖就一定是final在起作用?,明显是private方法不能被继承到子类,都没有继承到子类也就谈不上覆盖这种说法了。直接上例子:

public  class FinalDemo
{
	private void normalMethod(){}
	private final void finalMethod(){}
	
	public static void main(String[] args)
	{
		try
		{
			Method normalMethod = FinalDemo.class.getDeclaredMethod("normalMethod", null);
			Method finalMethod = FinalDemo.class.getDeclaredMethod("finalMethod", null);
			System.out.println(Modifier.toString(normalMethod.getModifiers()));
			System.out.println(Modifier.toString(finalMethod.getModifiers()));
			
		}
		catch (NoSuchMethodException | SecurityException e)
		{
			e.printStackTrace();
		}
	}
}

输出结果:

private
private final

对final关键字含义的总结:

final修饰的类不能被继承。

final修饰的方法不能被覆盖。

final成员变量表示常量,只能被赋值一次。被final修饰的值,如果是基本类型,那么值不可变,如果是对象则是引用不可变,对象的内容是可以改变的。

网上很多总结都是错误的,是“一家之言”,希望大家学习的时候本着技术的质疑和追根究底精神,而不是一味的盲从,把错误当成常识。


final的其他特性:

final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。

final本地变量必须在声明时赋值。


2、final应用场景

String以及Integer、Long等基本数据类型封装类都是final class;

Math中PI 和 E 都是用final修饰的字段;

Math中sin cos等函数也是用final修饰的;

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值