针对空白final的情况:编译器需要确保空白final在使用前必须得到初始化。即凡是在构造器执行之前的代码都可以完成对空白final执行初始化。

  1. public class FinalDemo {
  2. private final int i;
  3. //eg 普通代码块先于构造器执行
  4. {
  5. i = setI();
  6. }
  7. int setI(){
  8. return 3;
  9. }
  10. }

针对final修饰方法的说明:私有方法(无论是否包含final的修饰) 无法通过继承得到;从权限角度的话,也是无法访问到的

针对final修饰方法的理解:final方法都不是基类接口的一部分,对于扩展类来说,与基类final修饰的方法同名,仅仅是生成了一个新的方法,并没有覆盖基类的方法。

static final 与final的区别

  1. import java.util.Random;
  2. class Test {
  3. Test() {
  4. System.out.println("Test()");
  5. }
  6. }
  7. public class Exec_18 {
  8. private String name;
  9. public Exec_18(String s) { name = s; }
  10. //代表的是引用类型 static final修饰的引用类型和final修饰的引用类型有什么不同
  11. static final Test SFT = new Test(); // constant reference address
  12. final Test ft = new Test();
  13. //String static final修饰的String类型和final修饰的String类型有什么不同
  14. static final String SFS = "static final"; // class constant
  15. final String fs = "final";
  16. private static Random rand = new Random();
  17. //对于基本类型的初始化看看是否每次都会执行
  18. static final int SFI = rand.nextInt(); // class constant
  19. final int fi = rand.nextInt();
  20. public String toString() {
  21. return (name + ": " + SFT + ", " + ft + ", " + SFS + ", " + fs + ", " + SFI + ", " + fi);
  22. }
  23. public static void main(String[] args) {
  24. Exec_18 exec111 = new Exec_18("111");
  25. Exec_18 exec222 = new Exec_18("222");
  26. Exec_18 exec333 = new Exec_18("333");
  27. System.out.println(exec111);
  28. System.out.println(exec222);
  29. System.out.println(exec333);
  30. }
  31. }

🤔思考:多个类的实例,对其所拥有的static final域进行修改的话,其他实例是否可以感知到?

  1. class Hoo{
  2. String name;
  3. Hoo(){
  4. System.out.println("Hoo()");
  5. }
  6. void changeName(String name){
  7. this.name = name;
  8. }
  9. String getName(){
  10. return name;
  11. }
  12. }
  13. public class StaticDemo {
  14. static final Hoo hoo = new Hoo();
  15. @Override
  16. public String toString() {
  17. return " "+hoo;
  18. }
  19. public static void main(String[] args) {
  20. final StaticDemo staticDemo1 = new StaticDemo();
  21. final StaticDemo staticDemo2 = new StaticDemo();
  22. final StaticDemo staticDemo3 = new StaticDemo();
  23. staticDemo1.hoo.changeName("111");
  24. System.out.println(staticDemo1.hoo.getName());
  25. System.out.println(staticDemo2.hoo.getName());
  26. System.out.println(staticDemo3.hoo.getName());
  27. System.out.println("======================");
  28. staticDemo2.hoo.changeName("222");
  29. System.out.println(staticDemo1.hoo.getName());
  30. System.out.println(staticDemo2.hoo.getName());
  31. System.out.println(staticDemo3.hoo.getName());
  32. System.out.println("======================");
  33. staticDemo3.hoo.changeName("333");
  34. System.out.println(staticDemo1.hoo.getName());
  35. System.out.println(staticDemo2.hoo.getName());
  36. System.out.println(staticDemo3.hoo.getName());
  37. }
  38. }