[转]构造函数为什么不能被abstract/static/final/native/stricftp/synchronized修饰 及 一些关键字的用法from:http://www./realsmy/archive/2007/04/10/109256.html from:http://www./html/j2se/javajc/2010/0408/3262.html from:http://www./a/100627/50164/ from:http://blog./sword2008/13772.html from:http://www.cnblogs.com/wjun530/archive/2007/09/15/893802.html
不同于方法,构造器不能是abstract, static, final, native, strictfp, 或者synchronized的.
注:strictfp、native、transient、volatile用法 1)strictfp:strictfp的意思是FP-strict,也就是说精确浮点的意思。 在Java虚拟机进行浮点运算时,如果没有指定strictfp关键字时, Java的编译器以及运行环境在对浮点运算的表达式是采取一种近似于我行我素的行为来完成这些操作,以致于得到的结果往往无法令你满意。而一旦使用了 strictfp来声明一个类、接口或者方法时,那么所声明的范围内Java的编译器以及运行环境会完全依照浮点规范IEEE-754来执行。因此如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,那就请用关键字strictfp。 你可以将一个类、接口以及方法声明为strictfp,但是不允许对接口中的方法以及构造函数声明strictfp关键字。例如: 一、错误的使用方法 interface A { 二、合法的使用关键字strictfp strictfp interface A {} //接口 2)native:native是方法修饰符。Native方法是由另外一种语言(如c/c++,FORTRAN,汇编)实现的本地方法。有时java应用需要与java外面的环境交互。这是本地方法存在的主要原因。 因为在外部实现了方法,所以在java代码中,就不需要声明了,有点类似于接口方法。Native可以和其他一些修饰符连用,但是abstract方法和Interface方法不能用native来修饰。 在定义一个native method时,并不提供实现体(有些像定义一个java interface),因为其实现体是由非java语言在外面实现的。例: native与其它java标识符连用时,其意义同非Native Method并无差别,比如native static表明这个方法可以在不产生类的实例时直接调用,这非常方便,比如当你想用一个native method去调用一个C的类库时。上面的第三个方法用到了native synchronized,JVM在进入这个方法的实现体之前会执行同步锁机制。 3)transient:变量修饰符(只能修饰字段)。 标记为transient的变量,在对象存储时,这些变量状态不会被持久化。当对象序列化地保存在存储器上时,不希望有些字段数据被保存,为了保证安全性,可以把这些字段声明为transient。 4)volatile:volatile修饰变量。在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 volatile与synchronized的区别: 1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。 5)static: 1>静态方法:通常,在一个类中定义一个方法为static,那就是说,用类名而无需本类的对象即可调用此方法。静态方法常常为应用程序中的其它类提供一些实用工具所用。 2>静态变量:静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final则另当别论了。 3>static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。 在static{}内的代码,是用来进行显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。在涉及到继承的时候,会先初始化父类的static变量,然后是子类的,依次类推。 4>通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。但是,不能从静态内部类的对象中访问非静态的外围类对象和方法(可访问外部静态的对象、方法)。例如: public class StaticCls{ PS:非static内部类,初始化方法: outerObject=new outerClass(Constructor Parameters); outerClass.innerClass innerObject=outerObject.new InnerClass(Constructor Parameters); 注意在创建非静态内部类对象时,一定要先创建起相应的外部类对象。至于原因,非静态内部类对象有着指向其外部类对象的引用,一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量! static与非static内部类区别:1、静态内部类没有了指向外部的引用。2、在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套可以不止一层)。不过静态内部类中却可以拥有这一切。 6)final final变量: 在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。 其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。 还有一种用法是定义方法中的参数为final,对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说你可以在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法。 final方法:
7)static和final一块用表示什么 |
|