java中的静态块和静态变量

java中的静态块和静态变量,java,Java,我在变量启动后定义了“age”,我发现它是有效的。这两个变量都是静态的,所以为什么不按照代码顺序执行它们。有两件事需要考虑 初始化顺序(将值分配给字段的顺序) 作用域-在代码中可以看到字段的位置 如果我读对了你的问题,你似乎认为这两件事是一样的,但在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);
    }
    
    但这并没有那么令人困惑——只要把声明和赋值看作两个独立的东西——声明在整个类中都是范围内的,但赋值是按照源代码的顺序执行的。So
    private 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);
    }
    
    但这并没有那么令人困惑——只要把声明和赋值看作两个独立的东西——声明在整个类中都是范围内的,但赋值是按照源代码的顺序执行的。So
    private 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);
    }
    
    但这并没有那么令人困惑——只要把声明和赋值看作两个独立的东西——声明在整个类中都是范围内的,但赋值是按照源代码的顺序执行的。So
    private 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声明所有字段