为什么静态块中不允许静态字段声明?

时间:2012-11-14 12:18:35

标签: java swing awt

请考虑以下代码,用于计算String的像素宽度:

 public class ComponentUtils {
      static {
         Font font = new Font("Verdana", Font.BOLD, 10);
         FontMetrics metrics = new FontMetrics(font) {
        };
      }

    public static String calculateWidthInPixels(String value) {
       //Using the font metrics class calculate the width in pixels 
      }
}

如果我声明fontmetricsstatic类型,编译器将不允许我这样做。为什么这样 ?如何初始化fontmetrics一次并计算calculateWidthInPixels方法中的宽度?

P.S:以下主类始终按预期工作,并以像素为单位给出宽度。

public class Main  {

  public static void main(String[] args) {
        Font font = new Font("Verdana", Font.BOLD, 10);
        FontMetrics metrics = new FontMetrics(font){

        };
        Rectangle2D bounds = metrics.getStringBounds("some String", null);
        int widthInPixels = (int) bounds.getWidth();
    System.out.println("widthInPixels = " + widthInPixels);
  }

4 个答案:

答案 0 :(得分:5)

编译器确实允许你这样做。但是,它不允许您从方法访问您在那里声明的变量,因为它们的可见性仅限于该静态块。

您应该将它们声明为静态变量,如下所示:

private static final Font FONT = new Font(...);

答案 1 :(得分:4)

您必须声明类范围中的字段,而不是静态初始化块中的字段:

public class ComponentUtils {
    private static Font FONT;
    private static FontMetrics METRICS;

    static {
        FONT= new Font("Verdana", Font.BOLD, 10);
        METRICS= new FontMetrics(font) {};
    }

    public static String calculateWidthInPixels(String value) {
       //Using the font metrics class calculate the width in pixels 
    }
}

答案 2 :(得分:1)

您必须将fontmetrics字段设为静态:

 public class ComponentUtils {
      static Font font;
      static FontMetrics metrics;

      static {
         font = new Font("Verdana", Font.BOLD, 10);
         metrics = new FontMetrics(font) {
        };
      }

    public static String calculateWidthInPixels(String value) {
       //Using the font metrics class calculate the width in pixels 
      }
}

答案 3 :(得分:1)

块中的声明仅具有该块的名称范围。即使它是全球性的,你也无法访问它。