java final 详解_Java final关键字详解

本文详细介绍了Java中final关键字的四种主要用途:常量、方法、空白final和final类。final用于声明不可变的数据,确保方法不被覆盖,以及类无法被继承。通过实例解析了final修饰基本类型和引用类型的区别,以及final与private的结合使用。同时,讨论了final在类初始化和方法多态中的作用。
摘要由CSDN通过智能技术生成

在java中,final的含义在不同的场景下有细微的差别,但总体上来说,它指的是“这是不可变的”。下面,我们来讲final的四种主要用法。

final数据

在编写程序时,我们经常需要说明一个数据是不可变的,我们称为常量。在java中,用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内不可以再次赋值。更重要的是,final会告诉编译器,这个数据是不会修改的,那么编译器就可能会在编译时期就对该数据进行替换甚至执行计算,这样可以对我们的程序起到一点优化。不过在针对基本类型和引用类型时,final关键字的效果存在细微差别。我们来看下面的例子:

package s1;

public class L {

public static void main(String[] args) {

final int i1 = 1; //定义变量并直接赋常量,此时为编译时常量

i1 = 11;//编译出错,因为final数据只能赋值一次

final int i2; //定义变量,但先不赋值;在后面需要的地方再赋值,此时不是编译时常量

i2 = 2;

i2 = 12;//编译出错,因为final数据只能赋值一次

//此处i3虽然是final并赋值,但是赋的并不是常量,所以i3不是编译时常量

final int i3 = (int) (Math.random() * 10);

i3 = 13;//编译出错,因为final数据只能赋值一次

//上面部分是基本类型的例子,下面看看有关对象

final Value value1 = new Value();

value1 = new Value();//编译出错,因为final数据只能赋值一次

//下面这样是可以的,因为value1并没有改变(没有再次赋值),改变的仅仅是value1对象里面的value值

value1.value = 1;

value1.value = 1;

}

}

class Value {

int value;

}

空白final

java允许“空白final”,所谓空白final是指被声明为final但又未赋初始值的域。无论什么情况,编译器都确保空白final在使用前必须初始化。但是空白final在关键字final的使用上提供了更大的灵活性,为此,一个类中的final域就可以做到根据不同对象而有所不同,却又保持其恒定不变的特性。下面举个列子:

package s1;

public class L {

public static void main(String[] args) {

Value value1 = new Value(10);

value1.maxValue = 20;//编译出错,因为final数据只能赋值一次

Value value2 = new Value(20);

}

}

class Value {

final int maxValue;

Value(int value) {

this.maxValue = value;

}

}

final方法

使用final方法的原因主要是把方法锁起来,以防止继承者修改它的含义。这是出于设计的考虑:想要确保在继承中使方法行为保持不变,并且不会被覆盖。例子:

package s1;

public class L {

public static void main(String[] args) {

}

}

class L1 {

final void calculate() {

System.out.println(getClass().getSimpleName() + "calculate");

}

}

class L2 extends L1 {

void calculate() { //编译出错,不能覆盖L1中的calculate方法,因为它是final的

}

}

final和private关键字

类中的所有private方法都隐式地指定为final方法。由于子类无法调用访问父类的private方法,所以也就无法覆盖它,也就无法实现多态(关于多态,可以参考https://blog.csdn.net/GracefulGuigui/article/details/103869327)。可以对private方法添加final修饰词,但这并不会给该方法增加任何额外的意义。例子:

package s1;

public class L {

public static void main(String[] args) {

L1 l1 = new L2();

l1.test();

}

}

class L1 {

void test() {

calculate1();

calculate2();

}

private final void calculate1() {

System.out.println("L1 calculate1");

}

void calculate2() {

System.out.println("L1 calculate2");

}

}

class L2 extends L1 {

// 不会报错,虽然L1中calculate1方法是final,但是private限制了L2无法访问L1的calculate1,所以可以起同名+同参数列表的方法

void calculate1() {

System.out.println("L2 calculate1");

}

void calculate2() {

System.out.println("L2 calculate2");

}

}

运行结果:

L1 calculate1 //由于是private方法,不支持多态

L2 calculate2 // 因为多态,调用的实际是L2的calculate2

final类

final类比较简单易懂,被final修饰的类,则表明该类无法被其它类继承。

e263d446bc9cb861d944e38c92af2f8e.png

7443628b0808bf41c06574ee61e91166.png

陈贵贵

发布了64 篇原创文章 · 获赞 4 · 访问量 1万+

私信

关注

标签:Java,void,Value,class,详解,L1,final,赋值

来源: https://blog.csdn.net/GracefulGuigui/article/details/103935349

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值