ananan0801 2024-06-20 14:36 采纳率: 87.9%
浏览 0
已结题

Java中有关static的问题

img


为什么运行结果是先1再3再2,而不是按顺序的1 2 3 呢

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-20 14:36
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在Java中,关键字 static 表示一个成员(变量或方法)属于类本身,而不是类的实例。这意味着你可以在不创建类的实例的情况下访问或调用静态成员。

    在你提供的代码示例中,test1 类包含一个构造函数,该构造函数打印一条消息,格式为 "Test(" + i + ")",其中 i 是传递给构造函数的参数。这个类被实例化了三次,分别在代码的第9、10和11行。然而,这些实例化操作的执行顺序并不是按照它们在代码中出现的顺序。

    以下是代码中实例化 test1 类的顺序:

    1. 第9行:static test1 t1 = new test1(1);
    2. 第10行:test1 t2 = new test1(2);
    3. 第11行:static test1 t3 = new test1(3);

    在Java程序中,静态变量和静态块(如果存在)是在创建任何类的实例之前初始化的。这意味着第9行的 t1 会首先被初始化,因为它是一个静态变量。接下来,当 main 方法被执行时,它首先会创建 Q12 类的一个实例(第14行),然后是第10行的 t2,因为它在 main 方法的作用域内。最后,第11行的 t3 也会在 main 方法执行期间被初始化,因为它也是一个静态变量。

    这就是为什么输出结果是 Test(1),然后是 Test(3),最后是 Test(2) 的原因。静态变量的初始化顺序是按照它们在类中声明的顺序,但是非静态变量的初始化顺序取决于它们在代码中被创建的顺序。

    以下是你提供的代码的简化版本,以帮助理解:

    public class test1 {
        public test1(int i) {
            System.out.println("Test(" + i + ")");
        }
    }
    
    public class Q12 {
        static test1 t1 = new test1(1); // 静态变量,首先初始化
        test1 t2 = new test1(2); // 实例变量,在main方法中初始化
        static test1 t3 = new test1(3); // 静态变量,其次初始化
    
        public static void main(String[] args) {
            Q12 Q = new Q12(); // 创建Q12类的实例,初始化t2
        }
    }
    

    当你运行这个程序时,你会看到控制台输出的顺序是 Test(1),然后是 Test(3),最后是 Test(2)。这是因为静态变量 t1t3 在类加载时按声明顺序初始化,而 t2main 方法执行时初始化。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月28日
  • 已采纳回答 6月20日
  • 创建了问题 6月20日