【问题标题】:Why is this Java code in curly braces ({}) outside of a method?为什么这个 Java 代码在方法之外的大括号 ({}) 中?
【发布时间】:2011-08-17 10:17:40
【问题描述】:

我正在为 Java 认证考试做准备,我在其中一个练习测试中看到了这样的代码:

class Foo {  
    int x = 1;  
    public static void main(String [] args) {  
        int x = 2;  
        Foo f = new Foo();  
        f.whatever();  
    }  
    { x += x; }  // <-- what's up with this?
    void whatever() {  
        ++x;  
        System.out.println(x);  
    }  
}

我的问题是......在方法之外用花括号编写代码是否有效?这些(如果有的话)有什么影响?

【问题讨论】:

  • 斯蒂芬,由于主题的原因,它可能是重复的,但我以完全不同的方式得到了这个
  • 是的,正如其他人指出的那样。但是,在您获得 Java 认证后,您将在人生的某个时刻开始编程。请不要在日常工作中使用这种结构。请。我讨厌 Java 认证。它教给你各种令人不安的复杂方法,有时甚至是微妙的方法来迷惑你的同事和引入错误。
  • @rfeak 同意了。很难读,所以不要使用,如果使用,那么提供大量的cmets。
  • hii .. @nairdaen 我也想开始学习 java oracle 认证,所以有任何笔记、练习测试和程序、问题、网络链接或任何其他学习材料,你能提供给我吗这将非常有帮助,谢谢

标签: java syntax braces


【解决方案1】:

借自here-

通常,您会将初始化实例变量的代码放在 构造函数。使用构造函数有两种选择 初始化实例变量:初始化块和最终方法。 实例变量的初始化块看起来就像静态的 初始化块,但没有 static 关键字:

{
    // whatever code is needed for initialization goes here
} 

Java 编译器将初始化程序块复制到每个构造函数中。因此,这种方法可以用来在多个构造函数之间共享一个代码块。

您可能还想查看here 的讨论。

【讨论】:

  • 我有一个问题,为什么这段代码从未执行过...... { System.out.println("com.test.BaseClazz.initial"); }
【解决方案2】:

这是一个初始化块,在加载/创建类的实例时执行,用于初始化类的成员属性(参见 Java http://download.oracle.com/javase/tutorial/java/javaOO/initial.html)。您可以拥有任意数量的块,它们将从上到下进行实例化。

除了实例块之外,您还可以拥有任意数量的静态块来初始化静态成员。它们将被声明如下:

public class Initialization {

    static int b = 10;

    int a = 5;

    static {
        b = -9;
    }

    {
        a += 2;
    }

    public static void main(String[] args) throws Exception {

        System.out.println(ClientVoting.b);
        System.out.println(new ClientVoting().a);
        System.out.println(ClientVoting.b);
        System.out.println(new ClientVoting().a);

    }

    static {
        b = 1;
    }

    {
        a++;
    }
}

在初始化类时,静态成员“b”被初始化为 10,然后第一个静态作用域将其值更改为 -9,然后更改为 1。这仅在加载类时执行一次。这在 main 方法的第一行初始化之前执行。

另一方面,与您的类类似的示例是实例引用“a”。 A 初始化为 5,然后实例块将其更新为 7,最后一个块更新为 8。正如预期的那样,静态成员在此代码中仅初始化一次,而实例块在每次创建新实例时执行。

这个例子的输出是 1 8 1 8

【讨论】:

    【解决方案3】:

    这是一个initializer block。它用于设置实例变量。在构造函数上使用初始化块的动机是防止编写冗余代码。 Java 编译器将块的内容复制到每个构造函数中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 2011-04-03
      • 2011-05-25
      • 1970-01-01
      相关资源
      最近更新 更多