为什么PI定义为final后,就不能这样使用了?

为什么PI定义为final后,就不能这样使用了?创建的是一个匿名对象

img

因为你的 Circle 是 非静态的 内部类,只能被 类的 普通方法访问
解决:

  • 要么把 Circle 定义为 static 修饰
  • 要么 把 Circle 类 移到 和 主类HomeWork01 平级
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/259737
  • 这篇博客也不错, 你可以看下匿名内部类使用外部变量为什么必须是final修饰的
  • 除此之外, 这篇博客: final 字段的实现原理是什么?中的 final字段的可见性 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • final关键字的可见性是指:被final修饰的字段在构造器中一旦初始化完成,并且构造器没有把“this”的引用传递出去

    (this引用逃逸是一件很危险的事情,其他线程有可能通过这个引用访问到“初始化了一半”的对象),

    那在其他线程中就能看见final字段的值。

  • 以下回答由chatgpt基于相关博客总结生成:

    由于问题没有提供具体的编程语言和代码示例,我将以Java语言为例,假设有以下代码:

    public class MyClass {
      final double PI = 3.1415926;
    
      public static void main(String[] args) {
        // 创建匿名对象
        MyClass mc = new MyClass(){
          public void printPI(){
            System.out.println(PI);
          }
        };
    
        mc.printPI(); // 此处会出现编译错误
      }
    }
    

    在这个例子中,我们定义了一个类MyClass,其中定义了一个常量PI,并将其设置为final。在main方法中,我们创建了一个匿名对象,并重写了其中的printPI方法,以输出常量PI的值。然而,当我们尝试调用mc.printPI()时,会出现编译错误。

    这是因为在Java中,final修饰的变量的值无法被重新赋值。由于我们创建的是匿名对象,而匿名对象没有名字,无法通过别的方式改变其中final变量的值。因此,我们无法在匿名对象中调用final变量PI。

    解决这个问题的方法是,在定义匿名对象时不要引用final变量PI,而是将其直接写在重写方法中。例如:

    public class MyClass {
      final double PI = 3.1415926;
    
      public static void main(String[] args) {
        // 创建匿名对象
        MyClass mc = new MyClass(){
          public void printPI(){
            System.out.println(3.1415926);
          }
        };
    
        mc.printPI(); // 输出3.1415926
      }
    }
    

    这样,我们就可以在匿名对象中访问PI的值了,而不会出现编译错误。