为什么这段代码不能给我相同的结果呢?静态和静态的情况{}

时间:2018-02-09 14:54:51

标签: java static

我在静态问题{}和静态问题没有{}有什么区别。我会理解是否有人向我解释这两个代码之间的区别:为什么第一个代码会给我一个编译时错误?以及如何在{}使用静态关键字。

请查看我的第一个编译错误代码:

public class Lambdas {

@FunctionalInterface
public interface Calculate {
    int calc(int x, int y);

}

static {

    Calculate add = (a, b) -> a + b;
    Calculate difference = (a, b) -> Math.abs(a-b);
    Calculate divide = (a,b) -> b!=0 ? a/b : 0;
    Calculate multiply = (c, d) -> c * d ;

}

public static void main(String[] args) {

    System.out.println(add.calc(3,2)); // Cannot resole symbol 'add'
    System.out.println(difference.calc(5,10));  // Cannot resole symbol 'difference'
    System.out.println(divide.calc(5, 0));  // Cannot resole symbol 'divide'
    System.out.println(multiply.calc(3, 5));  // Cannot resole symbol 'multiply'

}


}

第二个代码段正常工作:

public class Lambdas {

@FunctionalInterface
public interface Calculate {
    int calc(int x, int y);

}


static Calculate add = (a, b) -> a + b;
static Calculate difference = (a, b) -> Math.abs(a - b);
static Calculate divide = (a, b) -> b != 0 ? a / b : 0;
static Calculate multiply = (c, d) -> c * d;


public static void main(String[] args) {

    System.out.println(add.calc(3, 2)); 
    System.out.println(difference.calc(5, 10)); 
    System.out.println(divide.calc(5, 0));  
    System.out.println(multiply.calc(3, 5));  
}


}

1 个答案:

答案 0 :(得分:0)

这是一个静态初始化块:

 static {

Calculate add = (a, b) -> a + b;
Calculate difference = (a, b) -> Math.abs(a-b);
Calculate divide = (a,b) -> b!=0 ? a/b : 0;
Calculate multiply = (c, d) -> c * d ;

 }

一个类可以有任意数量的静态初始化块,它们可以出现在类体中的任何位置。运行时系统保证按照它们在源代码中出现的顺序调用静态初始化块。

静态块有一种替代方法 - 您可以编写一个私有静态方法:

class Whatever {
public static varType myVar = initializeClassVariable();

private static varType initializeClassVariable() {

    // initialization code goes here
}
}

你的代码显示错误,因为变量(如add,difference)只有这个static {}块下的范围,并且你不能在其他方法上访问它们,它们也像构造函数,所以代码将在实例化类

时也会运行

来源Oracle