黑马程序员技术交流社区

标题: 关于final的作用? [打印本页]

作者: 华行天下    时间: 2013-10-20 23:22
标题: 关于final的作用?
本帖最后由 华行天下 于 2013-10-21 23:06 编辑

希望大家能描述的详细点!在此谢过
作者: 風諾    时间: 2013-10-20 23:36
1、final修饰的类不能被继承
2、final修饰的修饰的方法不能覆盖
3、final修饰的变量只能赋值一次
作者: ゞ心痛-τ._煩離    时间: 2013-10-21 00:01
1final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会再被扩展,那么就设计为final类。 final方法不能被子类的方法覆盖,但可以被继承。
2、final方法 如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。 使用final方法的原因有二: 第一、把方法锁定,防止任何继承类修改它的意义和实现。 第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
3、final变量(常量) 用final修饰的成员变量表示常量,只能被赋值一次,赋值后值无法改变! final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。 从下面的例子中可以看出,一旦给final变量初值后,值就不能再改变了。 另外,final变量定义的时候,可以先声明,而不给初值,这种变量也称为final空白,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,final空白在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。
4、final参数 当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。 注:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。 final不能用于修饰构造方法。
作者: kellyzyb    时间: 2013-10-21 16:09
final:最终的意思

1.可以用来修饰类,变量和函数。
2.被final修饰的类不可以被继承,某些实际需要 为了避免被继承,被子类复写其功能。
3.被final修饰后的变量变成一个常量。
在当描述事物时,一些数据的出现值是固定的,那么这时为了增加阅读性,都给这些值起个名字,方便于阅读。
     而这个值不需要改变,所以加上final修饰,作为常量:常量的书写规范所有字母都大写,如果由多个单词组成。单词通过_连接。
     如:public static fianl duoble PI =3.14;

4.被final修饰的方法不能被重写。

作者: HM代景康    时间: 2013-10-21 16:52
final方法将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。final类当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。
作者: 李江    时间: 2013-10-21 18:00
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
作者: 蜗牛强    时间: 2013-10-21 21:07
final这个关键字的概念一大堆,你去百度搜一搜多详细的都有,我只告诉你几个个容易引起错误的地方。
1:被final修饰的类,虽然不能被继承,final也代表最终的意思,但是被这个类创建的对象依然可以改变属性的值
举例
final class A{
int a=10;

main(){
A x=new A();
x.a=11;//A类虽然不可以变化,但是A的属性是可变的。

2:被final修饰的对象依然可以改变属性,不同的是它的引用不可以再指向其他对象。(地址固定)
举例
class A{
int a=10;

main()

final A x=new A();
x.a=12;//属性a可以改变
//x=new A()----错误写法,引用不可以创建其他对象

作者: Simple_love    时间: 2013-10-21 22:00
还有一点就是,局部内部类调用局部变量时, 局部变量需要变final的修饰,
  1. public class ThreadDemo {
  2.           void method()
  3.   {
  4.         final  int b=9;
  5.           class A
  6.           {
  7.                   void B()
  8.                   {
  9.                           System.out.println(b);
  10.                   }
  11.           }
  12.   }
  13. }
复制代码
因为对象的生命周期会超过局部变量的生命周期的,所有被final修饰的局部变量可以被该局部内部类访问, 主要是将所有的局部内部类对象要访问的final型局部变量,变成该内部类对象中的一个数据成员。这样,即使栈中局部变量(含final)已死亡,但由于它是final,其值永不变, 因而局部内部类对象在变量死亡后,照样可以访问final型局部变量。
作者: 马晓平    时间: 2013-10-21 23:02
Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2