针对空白final的情况:编译器需要确保空白final在使用前必须得到初始化。即凡是在构造器执行之前的代码都可以完成对空白final执行初始化。
public class FinalDemo {
private final int i;
//eg 普通代码块先于构造器执行
{
i = setI();
}
int setI(){
return 3;
}
}
针对final修饰方法的说明:私有方法(无论是否包含final的修饰) 无法通过继承得到;从权限角度的话,也是无法访问到的
针对final修饰方法的理解:final方法都不是基类接口的一部分,对于扩展类来说,与基类final修饰的方法同名,仅仅是生成了一个新的方法,并没有覆盖基类的方法。
static final 与final的区别
import java.util.Random;
class Test {
Test() {
System.out.println("Test()");
}
}
public class Exec_18 {
private String name;
public Exec_18(String s) { name = s; }
//代表的是引用类型 static final修饰的引用类型和final修饰的引用类型有什么不同
static final Test SFT = new Test(); // constant reference address
final Test ft = new Test();
//String static final修饰的String类型和final修饰的String类型有什么不同
static final String SFS = "static final"; // class constant
final String fs = "final";
private static Random rand = new Random();
//对于基本类型的初始化看看是否每次都会执行
static final int SFI = rand.nextInt(); // class constant
final int fi = rand.nextInt();
public String toString() {
return (name + ": " + SFT + ", " + ft + ", " + SFS + ", " + fs + ", " + SFI + ", " + fi);
}
public static void main(String[] args) {
Exec_18 exec111 = new Exec_18("111");
Exec_18 exec222 = new Exec_18("222");
Exec_18 exec333 = new Exec_18("333");
System.out.println(exec111);
System.out.println(exec222);
System.out.println(exec333);
}
}
🤔思考:多个类的实例,对其所拥有的static final域进行修改的话,其他实例是否可以感知到?
class Hoo{
String name;
Hoo(){
System.out.println("Hoo()");
}
void changeName(String name){
this.name = name;
}
String getName(){
return name;
}
}
public class StaticDemo {
static final Hoo hoo = new Hoo();
@Override
public String toString() {
return " "+hoo;
}
public static void main(String[] args) {
final StaticDemo staticDemo1 = new StaticDemo();
final StaticDemo staticDemo2 = new StaticDemo();
final StaticDemo staticDemo3 = new StaticDemo();
staticDemo1.hoo.changeName("111");
System.out.println(staticDemo1.hoo.getName());
System.out.println(staticDemo2.hoo.getName());
System.out.println(staticDemo3.hoo.getName());
System.out.println("======================");
staticDemo2.hoo.changeName("222");
System.out.println(staticDemo1.hoo.getName());
System.out.println(staticDemo2.hoo.getName());
System.out.println(staticDemo3.hoo.getName());
System.out.println("======================");
staticDemo3.hoo.changeName("333");
System.out.println(staticDemo1.hoo.getName());
System.out.println(staticDemo2.hoo.getName());
System.out.println(staticDemo3.hoo.getName());
}
}