javafinal编译
1. final关键字在java中有哪些用法
1、final类
final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。
2、final方法
如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
使用final方法的原因有二:
第一、把方法锁定,防止任何继承类修改它的意义和实现。
第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
3、final变量(常量)
用final修饰的成员变量表示常量,值一旦给定就无法改变!
final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。
另外,final变量定义的时候,可以先声明,而不给初值,这中变量也称为final空白,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,final空白在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。
4、final参数
当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。
5、static和final一块用表示什么
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问。
2. Java里的final作用是什么意思有是什么大虾解决下
Java中不能直接定义常量,但java提供了final关键字,被final关键字修饰的变量的值不能被修改,也就相当于定义了一个常量。对与java中的final变量,java编译器是进行了优化的。每个使用了final类型变量的地方都不会通过连接而进行访问
3. java 中final的作用是什么啊
在方法参数前面加final关键字就是为了防止数据在方法体中被修改。这里主要分两种情况:
第一,用final修饰基本数据类型;
第二,用final修饰引用类型。
第一种情况,修饰基本类型(非引用类型)。这时参数的值在方法体内是不能被修改的,即不能被重新赋值。否则编译就通不过。例如: publicvoidtestInt(finalintparam1){ param1=100; } 在方法体内修改了基本数据类型变量的值,在Eclipse中则会提示:“ The final local variable param1 cannot be assigned. It must be blank and not using a compound assignment.“
第二种情况,修饰引用类型。这时参数变量所引用的对象是不能被改变的。作为引用的拷贝,参数在方法体里面不能再引用新的对象。否则编译通不过。
例如:
publicvoidtestFinal2
(
finalObjectparam2
){
param2=newObject();
}
在方法体内修改了参数的引用,在Eclipse中则会提示:
“ The final local variable param2 cannot be assigned. It must be blank and not using a compound assignment.“
4. 在Java中,final修饰符要如何使用
final,字面上的意思是“最后的,最终的”,在Java中表示同样的含义。
final可以用来修饰变量、方法和类。
1.final修饰类
final修饰类时表示此类是“最后的、最终的”,即不能被继承,不能拥有自己的子类。
如果试图对一个已经用final修饰的类进行集成,则会在编译期间发生错误。
2.final修饰方法
final修饰方法表示此方法已经是“最后的、最终的”含义,即此方法不能被重写,但是可以被重载。PS:重写的前提是子类可以继承父类的方法,如果父类中final修饰的方法同时设置权限为private,则会导致子类不能继承此方法。但是,可以在子类中重新定义相同方法名和参数的方法,此时不会产生重写与final的矛盾。而是在子类中重新定义了新的方法。因为父类中及被private又被final修饰的那个方法根本没有被继承,子类在重新定义这个同名同参数方法时不会发生编译错误。
3.final修饰变量
final修饰的变量表示此变量是“最后的、最终的”。一旦定义了final变量并且在为其显示初始化后,final修饰的变量值不可被改变。
注意Attention:
1、final修饰的变量,无论是类属性、对象属性、形参还是局部变量,这些变量都需要程序员显示初始化,系统不会对final成员边来那个进行隐式初始化。
final修饰局部变量,与为被final修饰的变量一样,都需要显示初始化。即局部变量都需要显示初始化。
对一般的类属性和对象属性而言,首先都是先进行默认初始化,然后在对有显示赋值的变量进行显示初始化。
2、Java规定final修饰的类属性和变量熟悉感必须要进行显示初始化赋值。
3、无论是度与基本数据类型还是引用数据类型,final修饰的变量都是首次显示初始化后就不能修改的。对于final修饰的基本数据类型,由于在编译时就能确定该变量的至,于是吧该变量当做常量来处理。(常量命名规则:多个有意义的单词连接是,所有字符大写,单词之间用下划线分割)。对于final修饰的是引用数据类型,由于无法在编译是获得值,只能在运行时获得值。引用变量指向的是实际的对象,但是存储的是所指向对象的地址,因此,气质不能修改以为着其所指向的对象不能修改,即指向哪一个只能一直指向他,不能指向别的对象,但是可以修改这个对象内的属性。
5. java中的"final"关键字在多线程的语义中,有什么含义
关于final的重要知识点
final关键字可以用于成员变量、本地变量、方法以及类。
final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
你不能够对final变量再次赋值。
本地变量必须在声明时赋值。
在匿名类中所有变量都必须是final变量。
final方法不能被重写。
final类不能被继承。
final关键字不同于finally关键字,后者用于异常处理。
final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。
接口中声明的所有变量本身是final的。
final和abstract这两个关键字是反相关的,final类就不可能是abstract的。
final方法在编译阶段绑定,称为静态绑定(static binding)。
没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。
将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。
按照Java代码惯例,final变量就是常量,而且通常常量名要大写:
private final int COUNT = 10;
6. java中final怎么用
如果你想在类中使用一个恒定不变量,就可以使用final
如
public class Test {
private static final int x=100;
public static void main(String[] args) throws Exception {
x=2;//编译错误
}
}
上面的x即是整个class的全部变量,下面x=2;在编译的时候就会报错,因为final修饰的变量是不能改变的,可以把x当做常量使用
7. Java中的final方法
java中 fianl方法,如果有子类,子类不能覆盖该方法,因此这个方法修饰符 不能使abstract的。
8. java中final的用法
最终在Java中是不常见的,但它为我们提供的功能,例如在C语言中,常量的定义不仅如此,最终也允许你控制你的成员,方法或类是否可以被覆盖或继承功能,这些特点使得最终有在Java中一个不可缺少的角色,我们必须知道,当主键也学习Java。
类的,当你在关键字前面定义的变量加上最后的时候最后一个成员,也就是说,这个变量将不被一旦被初始化的改变,其中的含义不可变的基本类型其值是不可变的,它的对象的引用变量不再改变。其初始化可以在两个地方,一个在它的定义,那就是直接说给他们的任务在最后的变量定义,二是在构造函数中。这两个地方只能选其一,要么在定义中给定的值,要么在构造函数的值不能同时在定义给定值,并在构造函数中的另一个值。下面的代码演示了这一点:
进口的java.util.List;
进口的java.util.ArrayList;
进口java.util.LinkedList中;
公共类蝙蝠{
最后PI = 3.14; / /在定义将使索引值
最终诠释我; / /因为在构造函数中进行初始化,所以在这里我们不能给出一个值
最终名单列表; / /该变量也与上述相同的
蝙蝠(){
I = 100;
列表=新的LinkedList();
蝙蝠(INT二,表L){
I = II;
列表= 1;
公共静态无效的主要(字串[] args){
蝙蝠B =新的蝙蝠();
b.list.add(新蝙蝠());
/ / BI = 25;
/ / b.list =新的ArrayList();
System.out.println(“i =”+双+“列表类型:”+ b.list.getClass());
B =新的蝙蝠(23,新的ArrayList());
b.list.add(新蝙蝠());
System.out.println(“i =”+双+“列表类型:”。+ b.list的getClass());
这个程序是非常简单的一个常规用法最终的演示。这里初始化使用构造方法,它可以让你有一点点的灵活性。如果两个重载的构造函数蝙蝠所示,第一个缺省构造函数提供默认值?你,重载的构造函数,根据最终的值初始化变量或键入你所提供的。然而,有时你并不需要这种灵活性,你只需要在给定的时间定义它并不会改变它的值,那么你将无法使用此方法。有在main方法中陈述两行被注释掉了,如果你去掉注释,程序将无法编译,这就是说,无论是类型的值或列表我,一旦初始化,确实无法改变。然而,你可以通过重新初始化指定的双值或列表的类型,输出显示:
我= 100名单类型:类java.util.LinkedList
I = 23名单类型:java的类。util.ArrayList
另一个用途是定义方法的参数是最终的,基本类型的变量,这种没有任何实际意义,因为基本类型的变量,当调用方法是按值传递,这意味着你可以在这个参数变量的方法改变不影响调用语句,但对于对象变量,但它是非常有用的,因为对象是通过变量来传递它的引用,让你在一个方法改变对象的变量也当你需要一个对象变量改变作为方法的参数,使用最终明确宣告影响通话声明对象变量,它会防止你无意的影响到调用方法。
在内部类中方法参数的变量时使用另一种方法来更改这个参数也必须声明为final在使用前,如下面的代码所示:
公共类INClass {
无效,将InnerClass (最终字符串str){
类的iCLASS {
iCLASS非(){
System.out.println(STR);
iCLASS非IC =新的iCLASS();
公共静态无效的主要(字串[] args){
INClass INC =新INClass();
inc.innerClass(“你好”;);
最后进近
该方法声明为final,那就说明你已经知道这个方法提供的功能已经可以满足你的要求,不需要进行扩展并且不会允许任何类,从这个类继承重写此方法,但你仍然可以继承此方法的继承,可以直接使用。另外还有一个已知的机制,内联,它会使你的时候你直接调用的最后一个方法,方法体到呼叫时,而不是常规的方法调用,例如保存一个断点,推等,这可能但是让你的程序效率有所提高,当你接近拍摄对象是非常大的,或者如果你在很多地方调用此方法,那么你的代码会调用身体的迅速扩张,但可能会影响效率,所以你应该慎用最后进用该方法定义。
最后一类是最终当你的身体在课堂中使用时,您需要仔细考虑,因为一个final类不能被任何人继承,这也意味着这样的继承树是叶类,而这样的设计已经考虑完善,而不需要或扩展。对于最终的类成员,您可以将其定义为final,可能不会被最终确认。因为他们的级决赛之间的关系作为法,自然成了最后的类型。您也可以扫清道路,以最后final类,但它显然没有任何意义。
下面的程序演示了final方法和final类的用法:
最终级决赛{
最后的字符串str =“最终数据”;
公共字符串STR1 =“非最终数据”;
最后的公共无效的print(){
System.out.println(“最后一个方法。”);
公共无效是什么(){ System.out.println(STR +“\ n”+ str1的);
公共类FinalDemo {/ /最后的延伸不能继承
公共静态无效的主要(字串[] args){
最终F =新的最终();
f.what();
f.print();
由于可以从程序中可以看出,使用final类和普通类是几乎没有区别,但它失去了继承的特性。最后的方法不同于非final方法很难从程序网上看到,只记得小心。
最终应用在设计模式
在设计模式中的模型,称为不变的模式,java中可以很容易地通过final关键字实现这个模型,用来解释它的最终成员程序时Bat.java是一个常数模式实例。如果你有兴趣,你可以参考燕洪波谁写的“Java与模式”一书来解释。
9. Java,final什么意思
1. 修饰基础数据成员的final
这是final的主要用途,其含义相当于C/C++的const,即该成员被修饰为常量,意味着不可修改。如java.lang.Math类中的PI和E是final成员,其值为3.141592653589793和2.718281828459045。
2. 修饰类或对象的引用的final
在Java中,我们无法让对象被修饰为final,而只能修饰对象的引用,这意味着即使你写public
final A a = new A();
事实上a指向的对象的数据依然可以被修改,不能修改的是a本身的引用值,即你不能再对a进行重赋值。同样的情况出现在数组中,比如public final int[]
a = {1, 2, 3, 4, 5},事实上a中的数值是可修改的,即可以写a[0] =
3。据目前了解,java中数组内的数据是无法修饰为不可修改的,而C/C++可以。
3. 修饰方法的final
修饰方法的final和C/C++中修饰成员对象的const大不相同。首先,修饰方法的final含义不是“不可修改”,而是指该方法不可被继承成员重新定义。(注意,这里所说的不能被重新定义,并不是指子类一定不能定义同名方法,如果父类的方法是私有类型,子类是允许定义该方法的,这里指的不能重新定义是指不能通过改写方法来使得方法重写的多态性得以实现,如不希望A
a = new B(); a.f();这样的重写方法情况出现)
示例:
public class A {
// final方法f
public final void f() {
System.out.println("类A中的final方法f被调用了");
}
}
public class B extends A {
// 编译错误!父类的f方法是final类型,不可重写!
//! public void f() {
//! System.out.println("类B中的方法f被调用了");
//! }
}
此外,当一个方法被修饰为final方法时,意味着编译器可能将该方法用内联(inline)方式载入,所谓内联方式,是指编译器不用像平常调用函数那样的方式来调用方法,而是直接将方法内的代码通过一定的修改后到原代码中(将方法主体直接插入到调用处,而不是进行方法调用)。这样可以让代码执行的更快(因为省略了调用函数的开销),比如在int[]
arr = new int[3]调用arr.length()等。
另一方面,私有方法也被编译器隐式修饰为final,这意味着private final void
f()和private void f()并无区别。
4. 修饰类的final
当一个类被修饰为final时,它的含义很明确,就是不允许该类被继承,也就是说,该类“绝后”了,任何继承它的操作都会以编译错误告终。这也凸显出Java用final而不用const作为标识符的理由。(成员变量可以不是final,成员方法直接是final的)
示例:
public final class A {
}
// 编译错误!A是final类型,不可被继承!
//!public class B extends A{
//!}
5. 参数final
对对象参数做final修饰。以为对象变量传递的是其引用,为防止调用过程中无意的更改而修饰。
有好多人博客里边有的。
10. JAVA中final的作用及意思
final在Java中并不常用,然而它却为我们提供了诸如在C语言中定义常量的功能,不仅如此,final还可以让你控制你的成员、方法或者是一个类是否可被覆写或继承等功能,这些特点使final在Java中拥有了一个不可或缺的地位,也是学习Java时必须要知道和掌握的关键字之一。
final成员
当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。下面这段代码演示了这一点:
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
public class Bat{
final PI=3.14; //在定义时便给址值
final int i; //因为要在构造函数中进行初始化,所以此处便不可再给值
final List list; //此变量也与上面的一样
Bat(){
i=100;
list=new LinkedList();
}
Bat(int ii,List l){
i=ii;
list=l;
}
public static void main(String[] args){
Bat b=new Bat();
b.list.add(new Bat());
//b.i=25;
//b.list=new ArrayList();
System.out.println("I="+b.i+" List Type:"+b.list.getClass());
b=new Bat(23,new ArrayList());
b.list.add(new Bat());
System.out.println("I="+b.i+" List Type:"+b.list.getClass());
}
}
此程序很简单的演示了final的常规用法。在这里使用在构造函数中进行初始化的方法,这使你有了一点灵活性。如Bat的两个重载构造函数所示,第一个缺省构造函数会为你提供默认的值,重载的那个构造函数会根据你所提供的值或类型为final变量初始化。然而有时你并不需要这种灵活性,你只需要在定义时便给定其值并永不变化,这时就不要再用这种方法。在main方法中有两行语句注释掉了,如果你去掉注释,程序便无法通过编译,这便是说,不论是i的值或是list的类型,一旦初始化,确实无法再更改。然而b可以通过重新初始化来指定i的值或list的类型,输出结果中显示了这一点:
I=100 List Type:class java.util.LinkedList
I=23 List Type:class java.util.ArrayList
还有一种用法是定义方法中的参数为final,对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说你可以在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法。
另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用,如下代码所示:
public class INClass{
void innerClass(final String str){
class IClass{
IClass(){
System.out.println(str);
}
}
IClass ic=new IClass();
}
public static void main(String[] args){
INClass inc=new INClass();
inc.innerClass("Hello");
}
}
final方法
将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。
final类
当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。
下面的程序演示了final方法和final类的用法:
final class final{
final String str="final Data";
public String str1="non final data";
final public void print(){
System.out.println("final method.");
}
public void what(){
System.out.println(str+"\n"+str1);
}
}
public class FinalDemo { //extends final 无法继承
public static void main(String[] args){
final f=new final();
f.what();
f.print();
}
}
从程序中可以看出,final类与普通类的使用几乎没有差别,只是它失去了被继承的特性。final方法与非final方法的区别也很难从程序行看出,只是记住慎用。
final在设计模式中的应用
在设计模式中有一种模式叫做不变模式,在Java中通过final关键字可以很容易的实现这个模式,在讲解final成员时用到的程序Bat.java就是一个不变模式的例子。如果你对此感兴趣,可以参考阎宏博士编写的《Java与模式》一书中的讲解。