一些做淘宝优惠券的网站,wordpress 推广提成,有了网站怎样做公众号,网站标题优化工具一、前言关于这两个关键字#xff0c;应该是在开发工作中比较常见的#xff0c;使用频率上来说也比较高。接口中、常量、静态方法等等。但是#xff0c;使用频繁却不代表一定是能够清晰明白的了解#xff0c;能说出个子丑演卯来。下面#xff0c;对这两个关键字的常见用法…一、前言关于这两个关键字应该是在开发工作中比较常见的使用频率上来说也比较高。接口中、常量、静态方法等等。但是使用频繁却不代表一定是能够清晰明白的了解能说出个子丑演卯来。下面对这两个关键字的常见用法做点总结记录方便之后的回顾以及突击知识点。二、关键字 finalfinal一如字面意思 “最终的”大体在 Java 中表示 “不可变的”。可用来修饰类、方法、方法参数以及变量。1、修饰类final 在修饰类的时候代表的是此类不能被继承。也就是说如果一个类确定不会被继承使用则可以设计成 final类型的。典型的例子就是 String 类。2、修饰方法final 修饰的方法能被继承但是不能重写。可以重载。3、修饰方法参数final 在修饰方法参数的时候表示的是在执行方法的内部不能够去改变参数的值。但是如果是引用对象是可以改变应用对象的属性值。4、修饰变量final 在修饰变量代表的是不可变也即是常说的 “常量”。 final 在修饰的时候允许一次赋值之后在生命周期类不允许对其进行修改。修饰变量存在两种情况基本类型的数据 和 对象数据。在修饰基本类型数据的时候值是不可变的。在修饰对象数据的是对象的引用是不可改变的但是可以修改对象内部的属性值。final 修饰的变量必须在使用前进行初始化一种方式是在声明的时候就给出默认值。还有一种就是通过构造方法去设置。5、代码示例package com.cfang;import java.util.Calendar;import lombok.Data;import lombok.extern.slf4j.Slf4j;Slf4jpublic classT3 {public static voidmain(String[] args) {//-- 修饰变量final int b 0;/*** 编译报错The final local variable b cannot be assigned. It must be blank and not using a compound assignment*///b 2;//-- 修饰方法参数DemoCls cls newDemoCls();cls.setAge(10);log.info(democls age : {}, cls.getAge());int a 10;sayHello(a, cls);log.info(after call sayHello, democls age : {}, cls.getAge());}private static void sayHello(final inta, final DemoCls cls) {/*** 编译报错The final local variable a cannot be assigned. It must be blank and not using a compound assignment*///a 11;//cls new DemoCls();cls.setAge(11);}}DataclassDemoCls{private intage;}//-- 修饰方法Slf4jclassPerson {public final voidsaySth() {log.info(i am person);}}Slf4jclassMale extends Person{/*** 编译出错 Cannot override the final method from Person* 修饰的方法不能够被重写*///public final void saySth() {//log.info(i am male);//}public final voidsaySth(String msg) {log.info(i am male);}}其中修饰方法参数如果是引用对象是可以改变对象的属性值这一点也很好理解cls 是引用变量final 修饰引用变量只是限定了此引用变量 cls 的引用不能改变而实际引用的对象的本身的值是可以进行修改的。文字语言组织可能不是很清晰如下图所示一目了然的就知道说要表述的意思了。三、关键字 staticstatic静态的。在 Java 中static 通常可被用于修饰 变量、方法以及代码块。1、修饰变量static 修饰的变量叫做静态变量。static 变量被所有类对象共享在内存中仅一份随着类的初始化而被加载。与之对应的非静态变量是属于每个实例对象本身内存中存在多份相互间不影响。2、修饰方法static 修饰的方法叫做静态方法。调用静态方法不依赖于实例对象就可以进行访问所以静态方法是没有 this的。由于此特性以及非静态方法依赖于实例对象调用所以静态方法中是不能够直接使用非静态的成员属性和方法。与之相反的是非静态方法是可以直接访问使用静态成员变量和方法。同样的静态方法也是没有 super 的。可以一句话总结下由于 static 和具体的实例对象无关而 this、super和具体的实例对象息息相关所以static 和 this、super 势如水火一如白天与黑夜。3、修饰代码块static 修饰代码块在类初始化加载的时候会按照 static 块的顺序进行加载并且生命周期内只加载一次。基于此特性可以设计优化程序的性能一些只需要一次性初始化加载的内容就可以放在 static 块中进行。4、代码示例package com.cfang;import lombok.extern.slf4j.Slf4j;Slf4jpublic classT4 {private static inta;private static intb;private static intc;static{log.info(init value a);a 10;}{/*** 普通代码块依赖于实例对象*/log.info(init value c);c 12;}public static voidmain(String[] args) {//-- 静态方法调用非静态/*** 不可直接访问*///sayHello1();newT4().sayHello1();//-- 静态方法直接调用sayHello();//-- 静态代码块初始化资源log.info(value a : {}, a);log.info(value b : {}, b);log.info(value c : {}, c);}private static voidsayHello() {log.info(say hello);}private voidsayHello1() {log.info(say hello1);//-- 非静态方法直接调用sayHello();}static{log.info(init value b);b 11;}}5、static 常见误区package com.cfang;import lombok.Data;import lombok.extern.slf4j.Slf4j;Slf4jpublic classT5 {private static int a 10;public static voidmain(String[] args) {newT5().printVal();//-- The field DemoCls01.b is not visibleDemoCls01.b;}private voidprintVal() {int a 11;log.info(value a : {}, this.a);}}DataclassDemoCls01{private static intb;}5.1、static 的 this上述代码中最终运行 printVal 方法输出的结果是 value a : 10 。 其实这也很好理解 this 指代的当前对象而通过 new T5().printVal() 调用的话this 指代的就是当前新创建的实例对象static 修饰的变量本身是被所有类对象所共享的而 printVal 方法中 a 属于局部变量跟 this 实例对象并没有关联。所以输出的就是 10。5.2、static 与 可见性static 并不能改变变量或者方法的可见性。上述代码中main 方法中DemoCls01.b 会编译报错。5.3、static 与 局部变量Java规范中明确说明了 static 关键字不可修饰局部变量。四、总结final 和 static 联合使用修饰属性表示一旦给值就不可修改并且可以通过类名访问修饰方法表示该方法不能重写可以在不new对象的情况下调用。突然想到接口 interface 中成员变量的默认修饰符为 public static final方法的默认修饰符 public abstract 。