java中的静态块和静态变量
我在变量启动后定义了“age”,我发现它是有效的。这两个变量都是静态的,所以为什么不按照代码顺序执行它们。有两件事需要考虑java中的静态块和静态变量,java,Java,我在变量启动后定义了“age”,我发现它是有效的。这两个变量都是静态的,所以为什么不按照代码顺序执行它们。有两件事需要考虑 初始化顺序(将值分配给字段的顺序) 作用域-在代码中可以看到字段的位置 如果我读对了你的问题,你似乎认为这两件事是一样的,但在Java中,它们是分开的 虽然初始化本身是按源代码行的顺序进行的,但这不适用于字段的范围。 字段在类的整个主体的作用域中,也在声明之前 (同样,对于方法(或任何其他类型的成员)-您可以调用在调用点之后声明的方法。) 因为它在范围内(甚至在声明之前),
class Person{
public static String name="Mr.zhang";
//public static int age;
static{
age=20;
System.out.println("initiate age");
}
public static int age;
public static String address;
static{
address="beijing";
age=34;
}
public static void main(String[] args){
System.out.println(name);
System.out.println(age);
System.out.println(address);
}
但这并没有那么令人困惑——只要把声明和赋值看作两个独立的东西——声明在整个类中都是范围内的,但赋值是按照源代码的顺序执行的。Soprivate static int a=10代码>可以被视为:
public class Snippet {
static {
a = 20;
}
private static int a = 10;
static {
System.out.println(a);
}
public static void main(String[] args) {
System.out.println(Snippet.a);
}
}
为了给您一个背景参考,这些都是在Java语言规范中定义的。具体来说,是:
成员m
声明的范围,该成员在
类类型C
(§8.1.6)是C
的整个主体,包括任何嵌套
类型声明
有两件事你需要考虑
初始化顺序(将值分配给字段的顺序)
作用域-在代码中可以看到字段的位置
如果我读对了你的问题,你似乎认为这两件事是一样的,但在Java中,它们是分开的
虽然初始化本身是按源代码行的顺序进行的,但这不适用于字段的范围。
字段在类的整个主体的作用域中,也在声明之前
(同样,对于方法(或任何其他类型的成员)-您可以调用在调用点之后声明的方法。)
因为它在范围内(甚至在声明之前),所以可以在源文件的任何位置将其分配给该字段。您可以在源代码中的类文件末尾声明所有字段,这不会有什么区别
在声明字段的同时进行赋值是一个容易混淆的问题。像这样:
class Person{
public static String name="Mr.zhang";
//public static int age;
static{
age=20;
System.out.println("initiate age");
}
public static int age;
public static String address;
static{
address="beijing";
age=34;
}
public static void main(String[] args){
System.out.println(name);
System.out.println(age);
System.out.println(address);
}
但这并没有那么令人困惑——只要把声明和赋值看作两个独立的东西——声明在整个类中都是范围内的,但赋值是按照源代码的顺序执行的。Soprivate static int a=10代码>可以被视为:
public class Snippet {
static {
a = 20;
}
private static int a = 10;
static {
System.out.println(a);
}
public static void main(String[] args) {
System.out.println(Snippet.a);
}
}
为了给您一个背景参考,这些都是在Java语言规范中定义的。具体来说,是:
成员m
声明的范围,该成员在
类类型C
(§8.1.6)是C
的整个主体,包括任何嵌套
类型声明
有两件事你需要考虑
初始化顺序(将值分配给字段的顺序)
作用域-在代码中可以看到字段的位置
如果我读对了你的问题,你似乎认为这两件事是一样的,但在Java中,它们是分开的
虽然初始化本身是按源代码行的顺序进行的,但这不适用于字段的范围。
字段在类的整个主体的作用域中,也在声明之前
(同样,对于方法(或任何其他类型的成员)-您可以调用在调用点之后声明的方法。)
因为它在范围内(甚至在声明之前),所以可以在源文件的任何位置将其分配给该字段。您可以在源代码中的类文件末尾声明所有字段,这不会有什么区别
在声明字段的同时进行赋值是一个容易混淆的问题。像这样:
class Person{
public static String name="Mr.zhang";
//public static int age;
static{
age=20;
System.out.println("initiate age");
}
public static int age;
public static String address;
static{
address="beijing";
age=34;
}
public static void main(String[] args){
System.out.println(name);
System.out.println(age);
System.out.println(address);
}
但这并没有那么令人困惑——只要把声明和赋值看作两个独立的东西——声明在整个类中都是范围内的,但赋值是按照源代码的顺序执行的。Soprivate static int a=10代码>可以被视为:
public class Snippet {
static {
a = 20;
}
private static int a = 10;
static {
System.out.println(a);
}
public static void main(String[] args) {
System.out.println(Snippet.a);
}
}
为了给您一个背景参考,这些都是在Java语言规范中定义的。具体来说,是:
成员m
声明的范围,该成员在
类类型C
(§8.1.6)是C
的整个主体,包括任何嵌套
类型声明
有两件事你需要考虑
初始化顺序(将值分配给字段的顺序)
作用域-在代码中可以看到字段的位置
如果我读对了你的问题,你似乎认为这两件事是一样的,但在Java中,它们是分开的
虽然初始化本身是按源代码行的顺序进行的,但这不适用于字段的范围。
字段在类的整个主体的作用域中,也在声明之前
(同样,对于方法(或任何其他类型的成员)-您可以调用在调用点之后声明的方法。)
因为它在范围内(甚至在声明之前),所以可以在源文件的任何位置将其分配给该字段。您可以在t声明所有字段