动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

Java SE之final关键字

05-11 17:03 857浏览
举报 T字号
  • 大字
  • 中字
  • 小字

Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。Java SE中有很多的关键字,其中比较典型的关键字就是final。下面我们一起来深入学习final关键字。

Java语言中final是一个关键字(key words),其表示的三个含义:final修饰的变量是常量,final修饰的类不可继承,final修饰的方法不可重写。

final关键字三个特性:final修饰的变量为常量、final修饰的类不可继承、final修饰的方法不可重写。

1.final修饰的变量为常量

对于final修饰的变量,应该对基本类型和引用类型分开讨论:

(1)基本类型(byte short int long float double boolean char)

基本类型为栈内存(-128~127情况下),一旦被final关键字修饰,其变量属性变为只读,不再进行写操作,否则编译报错。

(2)引用类型 (类、接口、数组)

引用类型为堆内存,一旦被final关键字修饰,则引用不再改变,但是引用所指向的对象是可以被修改的,Java语言并未提供任何方式使用对象恒定不变。示意代码如下:

public class FinalData {
private final Value value=new Value(22);
public static void main(String[] args) {
	FinalData finalData=new FinalData();
	
	//finalData.value=new Value(33);   //编译报错    value为final类型   
	finalData.value.i++; // 编译通过  value所指向的对象可以修改 
}
}
class Value{
	int i;
	public Value(int i){
		this.i=i;
	}
}

因为被final修饰的变量一定要在使用前被初始化,所以如果没在定义操作,一定在构造函数中初始化,这种情况称为空白final。示例代码如下:

public class FinalData {
	private final int i;//基本类型示意
private final Value value;//引用类型示意
public FinalData(){ //  无参构造函数    空白final
	i=1;
	value=new Value(1);
}
public FinalData(int x){//有参构造函数  空白final
	i=x;
	value=new Value(x);
}
 
public static void main(String[] args) {
	new FinalData();
	new FinalData(22);
 
}
}
class Value{
	int i;
	public Value(int i){
		this.i=i;
	}
}

2. final修饰的类不可继承

类使用final关键字修饰之后,该类不可被继承,可以起到保护该类的作用。实例代码如下:

final class FinalFatherClass{
	
}
class SonClass extends FinalFatherClass{  //编译报错   final类不允许继承
	
}

3.final修饰的方法不可重写

class FinalFatherClass{
	final void f(){
		System.out.println("FinalFatherClass f()");
	}
}
class SonClass extends FinalFatherClass{  
	final void f(){//编译报错    
// 子类中某一方法的方法签名(方法名+形参列表)与父类相同,即可认为子类中该方法重写父类方法
//因final方法不可被重写,顾此处编译报错
		System.out.println("SonClass f()");
	}
}

值得注意的是,子类虽不能重写父类final函数,但是可以继承父类final函数,示意代码如下:

public class TestFinal {
public static void main(String[] args){
	FinalFatherClass son=new SonClass();
	son.f();    //打印  FinalFatherClass f()
	//因为子类未重写父类final函数,也不能重新父类final函数    
	//但子类可以继承父类final函数,所以调用父类 f()  打印  FinalFatherClass f() 
 
}
}
class FinalFatherClass{
	final void f(){
		System.out.println("FinalFatherClass f()");
	}
}
class SonClass extends FinalFatherClass{ 
	
}

从上面可以看到,final修饰的方法在特定的访问权限下可以被继承。

这是因为,方法是否被final修饰与方法的访问权限是两回事,没有任何关系,被final修饰的方法和未被final修饰的方法都可以自由的指定访问权限。

关于final关键字我们就讲到这里,当然final关键字在Java中的应用是灵活多变的,我们也应随机应变。我们也可以在动力节点在线的Java SE视频课程中参考其中的实例代码,深入理解掌握final关键字的使用。

0人推荐
共同学习,写下你的评论
0条评论
杨晶珍
程序员杨晶珍

98篇文章贡献357785字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

Java面试题及答案整理

提枪策马乘胜追击04-21 20:01

Mybatis返回值类型

代码小兵87207-15 12:10

Java string类详解

杨晶珍05-11 14:54

6道经典算法面试题

杨晶珍05-12 16:39

深入理解JVM虚拟机

杨晶珍05-12 17:30

发评论

举报

0/150

取消