Java关键字final的示例分析

小编给大家分享一下Java关键字final的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、常见问题

  • 所有的final修饰的字段都是编译期常量吗?

    Java关键字final的示例分析

  • 如何理解private所修饰的方法是隐式的final?

  • 说说final类型的类如何拓展?比如String是final类型,我们想写个MyString复用所有String中方法,同时增加一个新的toMyString()的方法,应该如何做?

  • final方法可以被重载吗?可以

  • 父类的final方法能不能够被子类重写?不可以

  • 说说final域重排序规则?

  • 说说final的原理?

  • 使用 final 的限制条件和局限性?

二、final修饰类

当某个类的整体定义为final时,就表明了你不能打算继承该类,而且也不允许别人这么做。即这个类是不能有子类的。注意:final类中的所有方法都隐式为final,因为无法覆盖他们,所以在final类中给任何方法添加final关键字是没有任何意义的。

三、final修饰方法

类中所有private方法都隐式地指定为final的,由于无法取用private方法,所以也就不能覆盖它。可以对private方法增添final关键字,但这样做并没有什么好处。

publicclassBase{
privatevoidtest(){
}
}

publicclassSonextendsBase{
publicvoidtest(){
}
publicstaticvoidmain(String[]args){
Sonson=newSon();
Basefather=son;
//father.test();
}
}

Base和Son都有方法test(),但是这并不是一种覆盖,因为private所修饰的方法是隐式的final,也就是无法被继承,所以更不用说是覆盖了,在Son中的test()方法不过是属于Son的新成员罢了,Son进行向上转型得到father,但是father.test()是不可执行的,因为Base中的test方法是private的,无法被访问到。

四、final方法是可以被重载的

我们知道父类的final方法是不能够被子类重写的,那么final方法可以被重载吗? 答案是可以的,下面代码是正确的。

publicclassFinalExampleParent{
publicfinalvoidtest(){
}

publicfinalvoidtest(Stringstr){
}
}

修饰参数Java允许在参数列表中以声明的方式将参数指明为final,这意味这你无法在方法中更改参数引用所指向的对象。这个特性主要用来向匿名内部类传递数据。

五、修饰变量

publicclassTest{
//编译期常量
finalinti=1;
finalstaticintJ=1;
finalint[]a={1,2,3,4};
//非编译期常量
Randomr=newRandom();
finalintk=r.nextInt();

publicstaticvoidmain(String[]args){

}
}

k的值由随机数对象决定,所以不是所有的final修饰的字段都是编译期常量,只是k的值在被初始化后无法被更改。

六、static final

一个既是static又是final 的字段只占据一段不能改变的存储空间,它必须在定义的时候进行赋值,否则编译器将不予通过。

publicclassfinaltest
{
//Random对象r
staticRandomr=newRandom();
//生成随机数k
finalintk=r.nextInt(10);
//生成随机数k2
staticfinalintk2=r.nextInt(10);

publicstaticvoidmain(String[]args){

finaltestt1=newfinaltest();

System.out.println("k="+t1.k+"k2="+t1.k2);

finaltestt2=newfinaltest();

System.out.println("k="+t2.k+"k2="+t2.k2);
}
}

k=2 k2=7k=8 k2=7我们可以发现对于不同的对象k的值是不同的,但是k2的值却是相同的,这是为什么呢? 因为static关键字所修饰的字段并不属于一个对象,而是属于这个类的。也可简单的理解为static final所修饰的字段仅占据内存的一个一份空间,一旦被初始化之后便不会被更改。

七、black final

Java允许生成空白final,也就是说被声明为final但又没有给出定值的字段,但是必须在该字段被使用之前被赋值,这给予我们两种选择:

  • 在定义处进行赋值(这不叫空白final)

  • 在构造器中进行赋值,保证了该值在被使用前赋值。

这增强了final的灵活性。

finalinti1=1;

finalinti2;//空白final

publicfinaltest(){
i2=1;
}
publicfinaltest(intx){
this.i2=x;
}

可以看到i2的赋值更为灵活。但是请注意,如果字段由static和final修饰,仅能在定义处赋值,因为该字段不属于对象,属于这个类。

以上是“Java关键字final的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2021-05-30 14:04:17
收藏
分享
海报
0 条评论
177
上一篇:element多个表单校验的实现方法 下一篇:Spring中事务传播特性的示例分析
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码