今天看了下Thinking in Java 关于final 的介绍。但感觉收益太少,请各位大哥们,高手们给小弟分析下:1.final 它除了用在变量上使其值不会被改变 及 用在成员方法上使其方法不会被重写 以及 用在类上使其不可被继承外。它还有什么用法?2.使用 final 声明的类,成员变量,成员方法,为什么说在性能上得到优化?它是如何优化的?3.如果我把我的javabean 里的成员方法都定义成了final.这样做会有什么问题?
解决方案 »
- DataInputStream.readUTF()可以读出值,为什么改用BufferedReader.readLine()就不行了
- 初学者求助 关于变量的访问权限
- 数据库读取生成JTREE出问题了,大家给点建议。谢谢
- 今天面试一个公司面试题,上来大家参考下
- 如何得到按钮名字?
- swing中的一个不大理解的问题
- 做一个语音聊天室需要考虑哪些问题?
- 什么是J2SE,J2EE,J2ME? J2SE跟以前的j2sdk-1_3_0_01-win.exe 有什么不同? 请各位大虾详细解释一下,好吗?
- throws关键字用不用为什么对程序运行没有影响?
- 各位大虾急救(有关数据库)
- 新安装了字体,怎么使用?
- 如何学习一个别人写好的项目?
所性能上要高点
其他的忘光了
所性能上要高点
其他的忘光了
一般程序中用到数字的话都会直接先定义成final static静态常量,这样便于程序的可读性....第二个
final的属性和方法在类被加载的时候就被初始化,不需要new对象就可以直接调用,所以节省内存空间,效率优化了吧。第三个没用过,全部定义成final的话,也就是类一旦加载,所有属性都会分配到空间,而你实际上是不会调用那么多属性的吧,造成资源浪费。
类内所有private方法都自动成为final。由于我们不能访问一个private方法,所以它绝对不会被其他方法覆盖(若强行这样做,编译器会给出错误提示)。可为一个private方法添加final指示符,但却不能为那个方法提供任何额外的含义。
2、3楼回答你了,但是我觉得不对吧?
3、无法使用set方法=======================================================
不需要初始化???我觉得不是吧
因为一般我们定义final类型的时候,都加了static关键字。而且即使有static,也并不能节省内存,它们只不过是已经初始化好了的属性和方法,可以直接用,它们已经“占好”了内存。最多是节省了使用 new 关键字开辟新内存空间的时间,节省的这些时间被消耗在了jvm加载class的时候了,而不是程序运行的时候。对不?
1.在修饰基本类型时,表示它是一个常量,在定义时必须给予赋值.特别的一个既是static又是final 的字段只占据一段不能改变的存储空间。
2.在修饰对象或者数组时,它表示对对象或数组的引用恒定不变,然而对象本身却是可以修改的. 空白final:声明为final但末给定初值的字段,但必须确保空白final在使用前被初始化,一般在构造方法完成。
final参数:在方法的参数列表以声明的方式将参数指明为final,这意味着在方法里无法修改参数的引用所指向的对象。二 final方法
使用final使用的原因有两个:
一. 把方法锁定,使得在子类(导出类)中不能修改它的含义。
二.效率,一个final方法被调用时会转为内嵌调用,不会使用常规的压栈方式,使得运行效率较高,尤其是在方法体较简单的情况下,但也并不绝对。(与C++中的inline关键字类似)
特别的:类中的所有private方法都隐式地指定为是final,所以在继承关系中不存在覆盖问题。三 final类
声明为final的类不能派生出了子类,也就是不能被继承,一个final类中的所有方法都隐式地指定为final.
类的声明中可以使用final,被定义成final的类不能再派生子类,类不能被继承。2.在成员方法中使用final
对于类中的方法可以定义为final,被定义成final的方法不能被重写。3.成员变量的声明中使用final
如果类的成员变量被定义为final,则变量一经赋值就不能改变。
嗯我说错了,其实想说的是static,一般final属性都会跟着static一起用的
对于final的变量在声明时不一定要赋值,你可以放在构造函数或者是其他的可以初始化的语句块中。例如:public class Test
{
public final int a; public Test()
{
a = 3;
}
}
或者public class Test
{
public static final int a;
static {
a=3;
}
public static void main(String[] args)
{
System.out.println(a);
}
}