Java关键字final、static使用总结
关键字static,final,private关键字
关键字static,final,private关键字Static 位置:统⼀特点:它会在java虚拟机加载类时优先加载这个代码块,相当于vip服务,可以直接通过类名调⽤作⽤:1.对象之间共享值,(通⽤的属性变量,可以设置为static)1. ⽅便访问变量作⽤位置1. 修饰变量(java虚拟机优先加载static修饰的变量,本类全局共享,)变量⼀般在类⾥⾯声明,calss层,不能在普通⽅法⾥⾯声明static修饰的变量(区部变量),Static在内存中只有⼀份拷贝,jvm只会加载⼀次,通过类名直接访问。
不需要实例化,再调⽤1. 修饰⽅法(与没有static修饰的⽅法区别)通过类名直接访问,不需要java虚拟机创建类的实例。
不同⽤this,会报错,在静态⽅法中只能访问静态资源,不能访问普通变量,静态⽅法不能被重写,通过基于引⽤类型调⽤3.修饰代码块静态初始化块多个静态代码块,jvm会按照顺序执⾏,只会执⾏⼀次4.内部类(静态嵌套类),只能访问静态成员⼯具类⾥⾯可以⽤stateic修饰,可以直接类名调⽤,静态变量和⾮静态变量区别在于,前者属于类,后者属于对象(多线程和并发情况下)导致竞争条件,Final1.修饰的class(类)不能继承像,String,double,Integer都是有final修饰的,为了防⽌继承之后修改内部类的数据2.修饰的⽅法不能被重写(覆盖)3.修饰的变量不能再次赋值,意思是已经是常量了成员变量:使⽤场景:1.定义时指定初始化值 2. 动态初始化块 3.构造器⽆法⾃动初始化,必须由⼯程时赋值,并且赋值之后不能再赋值局部变量只能赋值⼀次Private解决⽅案:1. ⽤private关键字将需要保护的成员变量进⾏修饰。
2. 修饰构造函数,就是这个类不能⽤普通的⽅法实例化,只有⽤类⾥⾯的其他⽅法实例化(单例模式)3. private修饰的是⽅法是私有⽅法,只能本类内部使⽤,不能被继承。
java中final关键字的用法
java中final关键字的用法
Java中的final关键字可以用于修饰类、方法和变量,其作用为:
1. final修饰的类不能被继承
final关键字可以用于修饰类,被修饰的类不能被继承。
这样做的目的是为了防止其他类对该类进行修改,保证该类的稳定性和安全性。
2. final修饰的方法不能被重写
final关键字可以用于修饰方法,被修饰的方法不能被子类重写。
这样做的目的是为了保证该方法的行为不会被修改,避免出现意外的错误。
3. final修饰的变量为常量
final关键字可以用于修饰变量,被修饰的变量为常量,一旦被赋值后就不能再次修改。
这样做的目的是为了保证该变量的值不会被修改,避免出现意外的错误。
4. final修饰的成员变量必须在声明时或构造函数中初始化
final关键字修饰的成员变量必须在声明时或构造函数中初始化,否则会编译错
误。
这样做的目的是为了保证该变量的值不会被修改,避免出现意外的错误。
5. final修饰的引用变量不能改变其引用的对象
final关键字修饰的引用变量不能改变其引用的对象,但是可以改变对象的属性值。
这样做的目的是为了保证该引用变量指向的对象不会被修改,避免出现意外的错误。
总之,final关键字的作用是为了保证程序的稳定性和安全性,避免出现意外的错误。
final和static的用法
final和static的用法final和static的用法final的用法•修饰类:被final修饰的类不能被继承。
这样可以确保类的完整性和安全性,避免被其他类修改或扩展。
•修饰方法:被final修饰的方法不能被子类重写。
这样可以确保方法的行为不会被修改,提高程序的稳定性和可靠性。
•修饰变量:被final修饰的变量称为常量,只能被赋值一次,之后不能再更改。
常量的命名通常使用全大写字母,多个单词之间用下划线分隔。
static的用法•修饰成员变量:被static修饰的成员变量属于类,而不是对象。
所有的对象共享同一个static变量的值,在内存中只会有一份拷贝。
•修饰方法:被static修饰的方法称为静态方法,可以直接通过类名调用,不需要创建对象。
静态方法只能访问静态成员,不能访问非静态成员。
•修饰代码块:被static修饰的代码块称为静态代码块,用于在类加载时执行一些初始化操作。
静态代码块只会在类加载时执行一次,且先于静态方法和构造方法执行。
•修饰内部类:被static修饰的内部类称为静态内部类,与外部类没有绑定关系,可以直接通过类名访问。
静态内部类不能访问外部类的非静态成员。
•修饰导入语句:在导入语句中使用import static可以导入静态成员,使得可以直接使用静态成员的名称,而不需要通过类名访问。
final和static的结合使用•final修饰的变量可以与static修饰的变量结合使用,称为静态常量。
静态常量在内存中只有一份拷贝,并且不能被修改。
•final修饰的方法可以与static修饰的方法结合使用,称为静态方法。
静态方法可以直接通过类名调用,而且不能被子类重写。
以上是final和static的一些基本用法和结合使用的情况。
它们在Java编程中非常常用,能够提高程序的效率和安全性。
通过合理使用final和static,我们可以更好地控制类的继承关系、变量的不可修改性和方法的可靠性。
final修饰类的例子final class MyClass {// class implementation}在这个例子中,被final修饰的类MyClass不能被继承。
Java中static关键字的作用和用法详细介绍
Java中static关键字的作⽤和⽤法详细介绍static表⽰“全局”或者“静态”的意思,⽤来修饰成员变量和成员⽅法,也可以形成静态static代码块,但是Java语⾔中没有全局变量的概念。
被static修饰的成员变量和成员⽅法独⽴于该类的任何对象。
也就是说,它不依赖类特定的实例,被类的所有实例共享。
只要这个类被加载,Java虚拟机就能根据类名在运⾏时数据区的⽅法区内定找到他们。
因此,static对象可以在它的任何对象创建之前访问,⽆需引⽤任何对象。
⽤public修饰的static成员变量和成员⽅法本质是全局变量和全局⽅法,当声明它类的对象市,不⽣成static变量的副本,⽽是类的所有实例共享同⼀个static变量。
static变量前可以有private修饰,表⽰这个变量可以在类的静态代码块中,或者类的其他静态成员⽅法中使⽤(当然也可以在⾮静态成员⽅法中使⽤–废话),但是不能在其他类中通过类名来直接引⽤,这⼀点很重要。
实际上你需要搞明⽩,private是访问权限限定,static表⽰不要实例化就可以使⽤,这样就容易理解多了。
static前⾯加上其它访问权限关键字的效果也以此类推。
static修饰的成员变量和成员⽅法习惯上称为静态变量和静态⽅法,可以直接通过类名来访问,访问语法为:类名.静态⽅法名(参数列表…)类名.静态变量名⽤static修饰的代码块表⽰静态代码块,当Java虚拟机(JVM)加载类时,就会执⾏该代码块(⽤处⾮常⼤,呵呵)。
1、static变量按照是否静态的对类成员变量进⾏分类可分两种:⼀种是被static修饰的变量,叫静态变量或类变量;另⼀种是没有被static修饰的变量,叫实例变量。
两者的区别是:对于静态变量在内存中只有⼀个拷贝(节省内存),JVM只为静态分配⼀次内存,在加载类的过程中完成静态变量的内存分配,可⽤类名直接访问(⽅便),当然也可以通过对象来访问(但是这是不推荐的)。
java中 static,final,transient,volatile,Volatile关键字的作用
缓存行非64字节宽的处理器(自行调整补充字节长度,原理一样)
共享变量不会被频繁的写。追加字节会导致CPU读取性能下降,如果共享变量写的频率很低,那么被锁的几率也很小,就没必要避免相互锁定了
Volatile无法保证原子性
volatile是一种“轻量级的锁”,它能保证锁的可见性,但不能保证锁的原子性。
由于自增操作是不具备原子性的,它包括读取变量的原始值、进行加1操作、写入工作内存。那么就是说自增操作的三个子操作可能会分割开执行,就有可能导致下面这种情况出现:
假如某个时刻变量inc的值为10,线程1对变量进行自增操作,线程1先读取了变量inc的原始值,然后线程1被阻塞了;然后线程2对变量进行自增操作,线程2也去读取变量inc的原始值,由于线程1只是对变量inc进行读取操作,而没有对变量进行修改操作,所以不会导致线程2的工作内存中缓存变量inc的缓存行无效,所以线程2会直接去主存读取inc的值,发现inc的值时10,然后进行加1操作,并把11写入工作内存,最后写入主存。
如下面的例子
public class Test {
public volatile int inc = 0;
public void increase() {
inc++;
}
public static void main(String[] args) {
追加字节优化Volatile性能
在某些情况下,通过将共享变量追加到64字节可以优化其使用性能。
在JDK 7 的并发包里,有一个队列集合类LinkedTransferQueue,它在使用volatile变量时,用一种追加字节的方式来优化队列出队和入队的性能。队里定义了两个共享结点,头结点和尾结点,都由使用了volatile的内部类定义,通过将两个共享结点的字节数增加到64字节来优化效率,具体分析如下:
final、static、staticfinal修饰符的用法与区
final、static、staticfinal修饰符的⽤法与区摘⾃:、在Java中,只要是被定义为final的类,也可以说是被final修饰的类,就是不能被继承的。
final规定:当你将final⽤于类⾝上时,⼀个final类是⽆法被任何⼈继承的,那也就意味着此类在⼀个继承树中是⼀个叶⼦类,并且此类的设计已被认为很完美⽽不需要进⾏修改或扩展。
对于final类中的成员,你可以定义其为final,也可以不是final。
⽽对于⽅法,由于所属类为final的关系,⾃然也就成了final型的。
你也可以明确的给final 类中的⽅法加上⼀个final,但这显然没有意义。
1.修饰类 当⽤final修饰⼀个类时,表明这个类不能被继承。
final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员⽅法都会被隐式地指定为final⽅法。
2.修饰⽅法 使⽤final修饰⽅法的原因有两个。
第⼀个原因是把⽅法锁定,以防任何继承类修改它的含义;第⼆个原因是效率。
在早期的Java实现版本中,会将final⽅法转为内嵌调⽤。
但是如果⽅法过于庞⼤,可能看不到内嵌调⽤带来的任何性能提升。
在最近的Java版本中,不需要使⽤final⽅法进⾏这些优化了。
因此,只有在想明确禁⽌该⽅法在⼦类中被覆盖的情况下才将⽅法设置为final。
注:⼀个类中的private⽅法会隐式地被指定为final⽅法。
3.修饰变量 对于被final修饰的变量,如果是基本数据类型的变量,则其数值⼀旦在初始化之后便不能更改;如果是引⽤类型的变量,则在对其初始化之后便不能再让其指向另⼀个对象。
虽然不能再指向其他对象,但是它指向的对象的内容是可变的。
final、static、static final的区别:static作⽤于成员变量⽤来表⽰只保存⼀份副本,⽽final的作⽤是⽤来保证变量不可变。
final:final可以修饰:属性,⽅法,类,局部变量(⽅法中的变量)final修饰的属性的初始化可以在编译期,也可以在运⾏期,初始化后不能被改变。
Java关键字staticfinal使用总结
Java关键字staticfinal使⽤总结 Static表⽰“全局”或者“静态”的意思,⽤来修饰成员变量和成员⽅法,也可以形成静态static代码块,被static修饰的成员变量和成员⽅法独⽴于该类的任何对象。
也就是说,它不依赖类特定的实例,被类的所有实例共享。
只要该类加载,JVM虚拟机就能根据类名在运⾏时数据区的⽅法区内找到他们。
因此,static对象可以在它的任何对象创建之前访问,⽆需引⽤任何对象。
1、static修饰类的成员⽅法或者成员变量,我们通常称该⽅法是静态⽅法,该⽅法是静态变量;若⽤public修饰static成员⽅法或者成员变量,表⽰该⽅法或该变量是全局的,可以在其他类中通过类名直接调⽤;若⽤private修饰static成员变量,表⽰该变量只能在该类的成员⽅法中使⽤,并且可以在该类的静态代码块中使⽤;在静态⽅法或者静态代码块中只能调⽤静态变量,但在⾮静态⽅法或者代码块中可以调⽤静态和⾮静态的变量。
2、静态代码块⾮静态代码块构造函数的加载顺序 静态代码块,在虚拟机加载类的时候就会加载执⾏,⽽且只执⾏⼀次 ⾮静态代码块,在创建对象的时候(即new⼀个对象的时候)执⾏,每次创建对象都会执⾏⼀次1public class StaticTest {2static {3 System.out.println("static function...");4 }5 {6 System.out.println("unstatic function...");7 }8public StaticTest(){9 System.out.println("construct function...");10 }11public static void main(String[] args) {12new StaticTest();13 }14 } 运⾏结果: 所以这三者的加载顺序是静态代码块>⾮静态代码块>类构造函数 注:⾮静态代码块在不new类的时候是不是执⾏的。
关键字final与关键字static
关键字final与关键字static⼀、final关键字和static的基本⽤法 final: 1)修饰类:当⽤final修饰⼀个类时,表明这个类不能被继承,同时,final类中所有成员⽅法都会被隐式的指定为final⽅法。
2)修饰⽅法:将⽅法锁定,以防⽌任何继承类修改它的含义。
备注:⽗类中,⽤final声明的⽅法是不能被⼦类覆盖的,但是同时⽤private修饰符的话,就可以,因为⽗类中的⽅法⽤private修饰时,对⼦类是不可见的,也就是说⼦类没有继承⽗类private修饰的⽅法,⾃然⼦类可以⾃⼰声明相应的⽅法。
(但这就不是严格意义上⽗⼦类函数覆盖了) 3)修饰变量:对于⼀个final变量,如果是基本数据类型的变量,则其数值⼀旦在初始化之后便不能更改;如果是引⽤类型的变量,则在对其初始化之后不能再让其指向另⼀个对象。
(换句话说:final修饰的变量内容是不能修改的,如果final修饰⼀个对象的引⽤,那么指的是这个对象的地址值是⽆法改变的,也就是不能再指向另⼀个对象,但是对象的内容还是可以修改的)注意: 1)⽗类的private成员⽅法是不能被⼦类⽅法覆盖的,所以说private类型的⽅法默认是final类型的。
【⼦类继承⽗类,⾃然就拥有了⽗类的所有属性和⽅法的,只不过⽗类的private属性和⽅法,⼦类是⽆法直接访问到的,即只是拥有,但⽆法使⽤。
】 2)final类的⽅法能否被同⼀个包的类访问取决于访问控制符,与final⽆关。
3)使⽤final关键字定义变量,不⼀定说⼀定要在变量定义的同时给定变量的具体数值,也可以在构造⽅法中完成初始化。
4)在使⽤final关键字定义的⽅法⾥不⼀定要使⽤final关键字定义⾥⾯的变量。
static: 1)修饰成员变量:声明为static的变量实际上就是全局变量,只是java中没有全局变量的说法⽽已。
当声明⼀个对象时,并不产⽣static变量的拷贝,⽽是该类所有的实例变量共⽤同⼀个static变量(接下来的static⽅法相似),就是说在类装载的时候,值分配⼀块存储空间,所有此类的对象都可以操纵此块存储空间。
Javastatic和final修饰符
Javastatic和final修饰符static 修饰符静态变量:static 关键字⽤来声明独⽴于对象的静态变量,⽆论⼀个类实例化多少对象,它的静态变量只有⼀份拷贝。
静态变量也被称为类变量。
局部变量不能被声明为 static 变量。
静态⽅法:static 关键字⽤来声明独⽴于对象的静态⽅法。
静态⽅法不能使⽤类的⾮静态变量。
静态⽅法从参数列表得到数据,然后计算这些数据。
对类变量和⽅法的访问可以直接使⽤ classname.variablename 和 classname.methodname 的⽅式访问。
如下例所⽰,static修饰符⽤来创建类⽅法和类变量。
public class InstanceCounter {private static int numInstances = 0;protected static int getCount() {return numInstances;}private static void addInstance() {numInstances++;}InstanceCounter() {InstanceCounter.addInstance();}public static void main(String[] arguments) {System.out.println("Starting with " +InstanceCounter.getCount() + " instances");for (int i = 0; i < 500; ++i){new InstanceCounter();}System.out.println("Created " +InstanceCounter.getCount() + " instances");}}以上实例运⾏编辑结果如下:Started with 0 instancesCreated 500 instancesfinal 修饰符final 变量:final 变量能被显式地初始化并且只能初始化⼀次。
staticprivate与final的用法总结
staticprivate与final的⽤法总结1.static表⽰静态。
他是属于类的。
可以在本⾝类⾥直接调⽤,或在其它类⾥⽤类名.⽅法名调⽤。
不加static表⽰是实例的⽅法,必须⽤实例来调⽤。
在本类⾥也⼀样,必须⽤实例调⽤2.private是私有的意思. private class Demo{ Demo类就是私有的了. 类是不能⽤private修饰的, 当类被修饰成private没有任何意思. 因为外部任何对象都访问不到Demo类了. private String str; str属性就私有的了外部类就访问不到这个属性了 private void hello(){ 外部类就访问不到hello()⽅法了 } } ⽤private关键字:使得你的程序更安全变量⼀般都是⽤private申明然后再本类通过 set get ⽅法控制该属性3.final—修饰符(关键字)如果⼀个类被声明为final,意味着它不能再派⽣出新的⼦类,不能作为⽗类被继承。
因此⼀个类不能既被声明为abstract的,⼜被声明为final的。
将变量或⽅法声明为final,可以保证它们在使⽤中不被改变。
被声明为final的变量必须在声明时给定初值,⽽在以后的引⽤中只能读取,不可修改。
被声明为final的⽅法也同样只能使⽤,不能重载。
static:静态修饰符 private:私有的,定义私有属性或⽅法,不能被其他类调⽤ final:不可变的。
我们在系统中经常定义某个常量(对象的值不可变)如下: private static final String VAR = "This is a unable changed Variable"; 该变量只能在当前这个类中被使⽤,并且是带有static修饰的静态函数中被调⽤。
加了final则该属性的值将不能被改变。
abstract:声明⽅法的存在⽽不去实现它的类被叫做抽象类(abstract class),它⽤于要创建⼀个体现某些基本⾏为的类,并为该类声明⽅法,但不能在该类中实现该类的情况。
Java中static与final的用法
Java中static与final的⽤法
static
static意为静态的,但凡被static修饰说明属于类,不属于类的对象。
加载:static在类加载时初始化(加载)完成。
可修饰:
内部类
⽅法
成员变量
代码块
注意:
static⽅法不能兼容this关键字。
你不能覆盖Java中的静态⽅法,因为⽅法覆盖基于运⾏时的动态绑定,静态⽅法在编译时使⽤静态绑定进⾏绑定。
虽然可以在⼦类中声明⼀个具有相同名称和⽅法签名的⽅法,看起来可以在Java中覆盖静态⽅法,但实际上这是⽅法隐藏。
final
加载:final可以在编译(类加载)时初始化,也可以在运⾏时初始化,初始化后不能被改变。
可修饰:类、内部类、⽅法、成员变量、局部变量、基本类型、引⽤类型。
final修饰基本类型:值不能被修改
final修饰引⽤类型:引⽤不可以被修改也就是说不能指向其他对象,但是该引⽤的对象内容可以被修改
final修饰⽅法,⽅法不可以重写,但是可以被⼦类访问,前提是⽅法不是private类型
final修饰类,类不可以被继承
static final
可修饰:成员变量、⽅法、内部类。
成员变量:属于类的变量且只能赋值⼀次
⽅法:属于类的⽅法且不可以被重写
内部类:属于外部类,且不能被继承。
final关键字的含义与用法
final关键字的含义与用法关键字final是Java中的保留关键字之一,它可以修饰类、方法和变量,表示它们的值一旦被赋值,就不能再被修改。
下面就是对final关键字的含义和用法进行详细的解析。
1. final修饰类final修饰类表示这个类不能被继承。
通常在设计某些不能被修改的类时使用final 关键字,这样可以保证这个类不会被错误的修改或影响。
Java的String类就是一个final 类。
以下是一个final类的例子:```javafinal class MyClass {//类定义}```2. final修饰方法final修饰方法表示这个方法不能被子类重写。
当我们需要确保某个方法在继承层次结构中保持不变时,就可以使用final关键字来修饰。
以下是一个final方法的例子:```javaclass MyClass {final void myMethod() {//方法定义}}```3. final修饰变量final修饰变量表示这个变量不能被重新赋值。
一旦被赋值,这个变量的值就不能再被修改。
final变量必须被初始化,即在定义时就要赋初值,否则会引起编译错误。
final 变量一般用于常量或配置参数等。
以下是一个final变量的例子:```javafinal int a = 10;```需要注意的是,final关键字不能保证变量在内存中的值不会被修改,因为可以通过反射或本地方法等手段修改变量的值。
但使用final关键字可以确保变量在逻辑上保持为常量。
除了以上三种用法外,我们还可以对构造方法使用final关键字,这样可以防止子类重写父类的构造方法。
final关键字可以用于保护类、方法和变量,确保它们不被修改或重写。
使用final 关键字可以进行编译时检查,从而避免一些错误的代码操作。
除了对类、方法和变量使用final关键字外,还有一些其他的细节需要注意。
1. final方法与虚拟机在Java虚拟机中,调用一个方法通常会使用虚拟方法调用(Virtual Method Invocation, VMI)的方式。
[java]final关键字的几种用法
[java]final关键字的⼏种⽤法在java的关键字中,static和final是两个我们必须掌握的关键字。
不同于其他关键字,他们都有多种⽤法,⽽且在⼀定环境下使⽤,可以提⾼程序的运⾏性能,优化程序的结构。
下⾯我们来了解⼀下final关键字及其⽤法。
final关键字在java中,final的含义在不同的场景下有细微的差别,但总体上来说,它指的是“这是不可变的”。
下⾯,我们来讲final的四种主要⽤法。
1.修饰数据在编写程序时,我们经常需要说明⼀个数据是不可变的,我们成为常量。
在java中,⽤final关键字修饰的变量,只能进⾏⼀次赋值操作,并且在⽣存期内不可以改变它的值。
更重要的是,final会告诉编译器,这个数据是不会修改的,那么编译器就可能会在编译时期就对该数据进⾏替换甚⾄执⾏计算,这样可以对我们的程序起到⼀点优化。
不过在针对基本类型和引⽤类型时,final关键字的效果存在细微差别。
我们来看下⾯的例⼦:1class Value {2int v;3public Value(int v) {4this.v = v;5 }6 }78public class FinalTest {910final int f1 = 1;11final int f2;12public FinalTest() {13 f2 = 2;14 }1516public static void main(String[] args) {17final int value1 = 1;18// value1 = 4;19final double value2;20 value2 = 2.0;21final Value value3 = new Value(1);22 value3.v = 4;23 }24 }上⾯的例⼦中,我们先来看⼀下main⽅法中的⼏个final修饰的数据,在给value1赋初始值之后,我们⽆法再对value1的值进⾏修改,final关键字起到了常量的作⽤。
Java中final与static关键字总结
一.final总结1.final修饰类:表示该类不可继承final不能修饰interface接口2.final修饰方法:表示该方法不能被子类覆盖(即子类不能重写父类的final方法,可以继承)final不能修饰构造函数3.final修饰字段属性:表示属性值第一次初始化后不能被修改final属性可以直接初始化或在构造函数中初始化如果属性是直接初始化,则其值不能被其它函数(包括构造函数)修改4.final修饰函数参数参数值不能被函数修改5.final修饰函数中的局部变量局部变量被第一次初始化后不能被修改public void hello() {final String name;name = "hi"; //okname = "hello"; //error}使用final的意义:第一,为方法“上锁”,防止任何继承类改变它的本来含义和实现。
设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖或改写,就可以采取这种做法。
第二,提高程序执行的效率,将一个方法设成final后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里(内嵌机制)。
二.static总结1.static修饰成员函数:该成员函数不能使用this对象static不能修饰构造函数static不能修饰函数参数static不能修饰局部成员变量2.static修饰成员字段当类被虚拟机加载时,首先按照字段声明的先后顺序对static成员字段进行初始化3.static修饰语句块当类被虚拟机加载时,按照声明顺序先后初始化static成员字段和static 语句块static所修饰的方法和字段是只属于类,所有对象共享。
在static所修饰的函数和语句块中不能使用非static成员字段。
在Java不能直接定义全局变量,是通过static来实现的在Java中没有const,不能直接定义常量,通过static final来实现。
javafinal关键字用法技巧汇总解析
java final关键字用法技巧汇总解析谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。
另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。
一、深入理解final关键字在了解了final关键字的基本用法之后,这一节我们来看一下final关键字容易混淆的地方。
1.类的final变量和普通变量有什么区别?当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。
那么final变量和普通变量到底有何区别呢?下面请看一个例子:11publ ic class Te st {public static void main(String[] args) {String a = “hello2”;final String b = “hello”;String d = “hello”;String c = b + 2;String e = d + 2;System.out.println((a == c));System.out.println((a == e));}}View Code大家可以先想一下这道题的输出结果。
为什么第一个比较结果为true,而第二个比较结果为fasle。
这里面就是final变量和普通变量的区别了,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。
也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。
这种和C语言中的宏替换有点像。
因此在上面的一段代码中,由于变量b被final修饰,因此会被当做编译器常量,所以在使用到b的地方会直接将变量b 替换为它的值。
Java中final是什么?作用是什么?如何使用?——关键字final
Java中final是什么?作⽤是什么?如何使⽤?——关键字final final概述含义: 最终的可以修饰的内容(1)修饰变量(局部变量成员变量(实例变量静态变量(类变量)))(2)修饰⽅法(成员⽅法)(静态⽅法)(3)修饰类(普通类)1、修饰变量(1)修饰局部变量特点:final 修饰的局部变量只能赋值⼀次,⼀旦赋值其值不可以改变案例:public class Demo2 {public static void main(String[] args) {// final int a = 10;//局部变量// a = 20;//第⼆次赋值// System.out.println(a);final int a;//声明a = 10;//第⼀次赋值//a = 20;//报错System.out.println(a);}}(2)修饰成员变量特点:1.final修饰的实例变量没有默认值2.final修饰的实例变量只能赋值⼀次3.final修饰的实例变量可以在构造⽅法中初始化/构造代码块中/直接赋值 ,但是当使⽤构造⽅法赋值的时候要保证每个构造都必须能够为这个变量初始化案例://案例1:关于特点1public class Demo2 {public static void main(String[] args) {Test test = new Test();System.out.println(test.a);//0}}class Test{final int a ;}//案例2: 关于特点2package com.ujiuye.day11;public class Demo2 {public static void main(String[] args) { Test test = new Test();System.out.println(test.a);//10//修改值test.a = 20;}}class Test{final int a = 10;//也只有⼀次赋值机会 }//案例3:package com.ujiuye.day11;public class Demo2 {public static void main(String[] args) { Test test = new Test();System.out.println(test.a);//10// test.a++;}}class Test{//1 直接赋值//final int a = 10;//也只有⼀次赋值机会 // 2 构造代码块进⾏赋值// final int a;//声明//// {// a = 10;// }//3 构造⽅法赋值final int a;public Test() {a = 10;}public Test(int a) {this.a = a;}}(3)修饰静态变量特点:1.final修饰的类变量没有默认值2.final修饰的类变量可以通过静态代码块进⾏初始化/ 也可直接进⾏初始化3. 只能赋值⼀次案例://案例1: 关于特点1public class Demo2 {public static void main(String[] args) {System.out.println(Test.a);}}class Test {final static int a;//静态变量}//案例2:关于特点2package com.ujiuye.day11;public class Demo2 {public static void main(String[] args) {System.out.println(Test.a);}}class Test {final static int a ;//静态变量static {a = 10;}}修饰⽅法修饰成员⽅法和静态⽅法特点:1.final修饰的成员⽅法&静态可以重载2.final修饰的实例变量只能赋值⼀次3. final修饰的静态⽅法本来可以形成⼀个符合重写语法的⽅法,但是被final修饰之后,也不能定义符合重写语法的⽅法了.案例://案例1: 关于特点1public class Demo2 {public static void main(String[] args) {System.out.println(Test.a);}}class Test {public final void m1(){System.out.println("我是成员⽅法m1");}//重载m1public void m1(int a){System.out.println("我是重载m1⽅法");}public static void m2(){System.out.println("我是静态⽅法m2");}public static void m2(int a){System.out.println("我是重载静态⽅法m2");}}修饰类语法:final class Animal{}特点:final修饰的类没有⼦类俗称断⼦绝孙类不能被继承Java中常见的被final修饰的类: String Math System案例:public class Demo2 {public static void main(String[] args) {}}final class Test{}class TestSub extends Test{//此处报错}。
Java中final几种常用用法及final关键字的作用说明
Java中final⼏种常⽤⽤法及final关键字的作⽤说明Java中的final共有三种⽤法:final成员变量当你在类中定义变量时,在其前⾯加上final关键字,那便是说,这个变量⼀旦被初始化便不可改变,这⾥不可改变的意思对基本的类型来说是其值不可变,⽽对于对象变量来说其引⽤不可再变,但引⽤变量所指向的对象中的内容还是可以改变的。
其初始化可以在三个地⽅:⼀是其定义处,也就是说在final变量定义时直接给其赋值;⼆是在构造⽅法中,⽽且在java1.1以前,只能时在定义的时候给赋值;三是在初始化代码块中 {} 或者 static{}下⾯这段代码演⽰了这⼀点:public class FinalUseTest {final double PI = 3.14; // 在定义时便给址值final int i; // 因为要在构造函数中进⾏初始化,所以此处便不可再给值final List<FinalUseTest> list; // 此变量也与上⾯的⼀样FinalUseTest() {i = 100;list = new LinkedList<>();}FinalUseTest(int ii, List<FinalUseTest> l) {i = ii;list = l;}public static void main(String[] args) {FinalUseTest b = new FinalUseTest();b.list.add(new FinalUseTest());//引⽤不可变,但引⽤指向的内容是可以变的// b.i=25;// syntax error i是不可变的// b.list=new ArrayList();// 错误,对象引⽤是不可变的System.out.println("I=" + b.i + " List Type:" + b.list.getClass());b = new FinalUseTest(23, new ArrayList<FinalUseTest>());b.list.add(new FinalUseTest());System.out.println("I=" + b.i + " List Type:" + b.list.getClass());}}再例如,对于如下语句:final static StringBuffer a=new StringBuffer("dachun"); 执⾏如下语句将报告编译期错误:a=new StringBuffer(""); 但是,执⾏如下语句则可以通过编译:a.append("zuishuai");有⼈在定义⽅法的参数时,可能想采⽤如下形式来阻⽌⽅法内部修改传进来的参数对象:public void method(final StringBuffer param){}实际上,这是办不到的,在该⽅法内部仍然可以增加如下代码来修改参数对象,其它对象亦如此:param.append("a");此程序很简单的演⽰了final的常规⽤法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名
用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块(用处非常大,呵呵)。
1、final类
final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。
2、final方法
如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
package org.leizhimin;
public class Test3 {
private final String S = "final实例变量S";
private final int A = 100;
public final int B = 90;
}
}
3、final变量(常量)
用final修饰的成员变量表示常量,值一旦给定就无法改变!
final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。
从下面的例子中可以看出,一旦给final变量初值后,值就不能再改变了。
final int c; //final空白,一直没有给赋值.
a = 3;
//a=4; 出错,已经给赋过值了.
//b=2; 出错,已经给赋过值了.
对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
2、静态方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!!
E = x;
}
/**
* @param args
*/
public static void main(String[] args) {
Test3 t = new Test3(2);
}
public static void main(String[] args) {
Test2 t=new Test2();
t.f1();
t.f2(); //调用从父类继承过来的final方法
t.f3(); //调用从父类继承过来的方法
//t.f4(); //调用失败,无法从父类继承获得
//t.A=101; //出错,final变量的值一旦给定就无法改变
//t.B=91; //出错,final变量的值一旦给定就无法改变
//t.C=81; //出错,final变量的值一旦给定就无法改变
Hale Waihona Puke System.out.println(t.D); //不推荐用对象方式访问静态字段
System.out.println(Test3.C);
System.out.println(Test3.D);
//System.out.println(Test3.E); //出错,因为E为final空白,依据不同对象值有所不同.
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。
static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
使用final方法的原因有二:
第一、把方法锁定,防止任何继承类修改它的意义和实现。
第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
例如:
public class Test1 {
public static void main(String[] args) {
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法。
注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
Java关键字final、static使用总结
一、final
根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
final类不能被继承,没有子类,final类中的方法默认是final的。
}
public void f1(final int i) {
//i++; //i是final类型的,值不允许改变的.
System.out.print(i);
}
}
二、static
另外,final变量定义的时候,可以先声明,而不给初值,这中变量也称为final空白,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,final空白在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。
因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
3、static代码块
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。例如:
1、static变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
private void test() {
System.out.println(new Test3(1).A);
System.out.println(Test3.C);
System.out.println(Test3.D);
}
}
4、final参数
当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。
public class Test4 {
public static void main(String[] args) {
new Test4().f1(2);
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
public static final int C = 80;
private static final int D = 70;
public final int E; //final空白,必须在初始化对象的时候赋初值
public Test3(int x) {
public class Test5 {
private static int a;
private int b;
static {
// TODO 自动生成方法存根
}
public void f1() {
System.out.println("f1");
}
//无法被子类覆盖的方法
public final void f2() {
System.out.println("f2");
}
public void f3() {
}
public void test2() {
final int a; //final空白,在需要的时候才赋值
final int b = 4; //局部常量--final用于局部变量的情形
System.out.println("f3");
}
private void f4() {
System.out.println("f4");
}
}
public class Test2 extends Test1 {
public void f1(){
System.out.println("Test1父类方法f1被覆盖!");
//t.D=71; //出错,final变量的值一旦给定就无法改变