我在静态问题{}和静态问题没有{}有什么区别。我会理解是否有人向我解释这两个代码之间的区别:为什么第一个代码会给我一个编译时错误?以及如何在{}使用静态关键字。
请查看我的第一个编译错误代码:
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));
}
}
答案 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