我申请了一份工作,他们给了我一个java测试。有许多我不熟悉的未知概念,也有较新的概念。一个是静态场。我发布了下面最奇怪的问题之一并寻求帮助。
该代码包含评论中的问题。
public class MyClass {
//what is the purpose of section, I mean for which purpose is it being used?
//can variables inside of belove section be used or not. If can be used, then how?
static{
int a=5;
double x=4.1;
}
//why this does not give any error because of redecleration of integer a?
static int a=4;
public static void main(String[] args) {
System.out.println(a+"");//the output is 4
}
}
答案 0 :(得分:5)
此块
static{
int a=5;
double x=4.1;
}
称为静态初始化程序。当初始化字段可能需要多个语句时,它用于初始化static
字段。
但是在这里,你实际上并没有初始化任何静态变量。您刚刚声明了两个局部变量。
这是重要的一行:
static int a=4;
答案 1 :(得分:3)
您的静态区块会打开一个新范围:
static{
int a=5;
double x=4.1;
}
在此范围内,a
和x
被创建为本地视觉效果,一旦范围结束,它们就会消失,就像其他任何范围一样,静态与否
这就是不与静态成员'a'冲突的原因,它被初始化为4
,导致该值被打印出来。
答案 2 :(得分:2)
这是一个static initializer
。它在加载类时执行。您可以将其视为class constructor.
static{
int a=5;
double x=4.1;
}
为什么由于重整整数a而没有出现任何错误?
static int a=4;
有two local variables
个don't conflict as 'a' is inside the 'static' block.
,另一个变量'a'位于class level
。
答案 3 :(得分:2)
这不是一个答案,只是测试了我从答案中理解的内容 玩我得到以下结果的代码
public class MyClass {
static int a=6;
static double x=6.1;
static{
int a=5;
double x=4.1;
initialize(a, x);
}
public static void main(String[] args) {
System.out.println("value of a = "+a);//the output is value of a = 5
System.out.println("value of x = "+x);//the output is value of x = 4.1
}
static void initialize(int a1, double x1){
a=a1;
x=x1;
}
}
另一个镜头
public class MyClass {
static{
int a=5;
double x=4.1;
initialize(a, x);
}
static int a=6;
static double x=6.1;
public static void main(String[] args) {
System.out.println("value of a = "+a);//the output is value of a = 6
System.out.println("value of x = "+x);//the output is value of x = 6.1
}
static void initialize(int a1, double x1){
a=a1;
x=x1;
}
}
答案 4 :(得分:1)
有两个问题,所以你会得到两个答案。
答案 5 :(得分:1)
块
static{
}
称为静态初始化程序。它的作用类似于Class实例的构造函数(不是Object实例)。静态行没有给出任何错误的原因是因为在静态块中声明和初始化的变量仅限于该块。块完成执行后,这些变量超出范围,不再适用。这条线
static int a=4;
然而是类作用域,所以它引用了一个完全不同的变量,尽管它具有相同的名称,这与下面代码中具有相同名称的两个变量引用两个不同变量的方式大致相同:
public MyObject{
private int value;
public MyObject(int value){
this.value = value; // "this" means this instance and removes any ambiguity
// for the compiler
}
}
在这两种情况下,变量的范围都不同,编译器将它们视为两个不同的变量。
答案 6 :(得分:1)
静态块可用于初始化通常在其构造函数中不会出现的对象,而且几乎从不用于基元:
public class Foo {
static Bar soap = new Bar();
static {
soap.doSomething();
soap.removeSuds();
Bar.doSomethingElse(soap);
}
...
}
答案 7 :(得分:1)
我想如果你看到这个链接,可能是满足你渴望的机会。
http://www.jusfortechies.com/java/core-java/static-blocks.php
答案 8 :(得分:1)
static {
int a=5;
double x=4.1;
}
上述块的目的是使其中的代码在main()
方法之前执行。
每当在java中打开一个块并在其中声明一些内容时,这里一个带有变量a和x的静态块变为该特定块的本地,即a和x不能在静态块之外访问。
有关java中变量的范围和生命周期的更多信息,请参阅以下链接:
http://www.cs.umd.edu/~clin/MoreJava/Objects/local.html
http://www.c4learn.com/java/java-variable-scope/
因此,此代码中的静态块只会让您感到困惑,它对您的案例中的程序执行或结果没有任何影响。
执行静态块之后,我们已经移出它,从而破坏了它的本地资源,即a和x。现在,根据Java,不存在任何名为a
的变量,可以初始化具有相同名称的新变量。
@ismail - 在Java中,所有代码都像其他任何语言一样从上到下执行。假设您在调用main()
方法之前执行了所有静态块。所以考虑一下你有两个静态块的情况:
public class MyClass {
static {
System.out.println("Static Block 1");
}
static {
System.out.println("Static Block 2");
}
}
上述代码的输出为
Static Block 1
Static Block 2
你在第一段代码中做了类似的事情。 1.您声明了一些静态实例变量。 2.您创建了一个带有一些局部变量的静态块,并从该块调用了一个可以操作实例变量的函数。 3.由于Java的流程,首先创建实例变量,然后由静态块操纵它们。这就是你收到修改后的输出的方法。
但在第二段代码中,静态实例变量在执行静态块后被初始化,因此您在输出中收到了初始值。
答案 9 :(得分:0)
static{
int a=5;
double x=4.1;
}
声明两个LOCAL变量a
和x
,这些变量在静态块之外是不可用的。
static int a=4;
在类级别声明,可以被类中的所有方法使用。
System.out.println(a+"");
在类级别查找变量a并打印4