活动介绍
file-type

Java初始化顺序:静态成员、静态块与实例化解析

5星 · 超过95%的资源 | 下载需积分: 50 | 7KB | 更新于2024-09-14 | 60 浏览量 | 17 下载量 举报 收藏
download 立即下载
"Java编程语言中的初始化顺序是程序员在编写代码时需要理解的关键概念,尤其涉及到静态成员变量、静态初始化块、非静态成员变量和非静态初始化块时。本文将详细解析这些概念以及它们的初始化顺序。" 在Java中,初始化顺序遵循一定的规则,主要分为静态初始化和实例初始化两个阶段。以下是对Java初始化顺序的详细说明: 1. **静态初始化阶段**: - 首先,当类被加载到JVM(Java虚拟机)时,会执行类的静态初始化。这意味着静态成员变量和静态初始化块(如果有的话)会被首先处理。 - 在`StaticCode1`类的例子中,类`InstanceVariable`的静态初始化块(打印"1")首先被执行,因为它是被`StaticCode1`类的静态成员`tsc`引用的。 - 随后,`StaticCode1`类的静态成员`tsc`被初始化,这将触发`StaticCode1`的构造函数`new StaticCode1()`,输出"3"。注意,尽管`tsc`在代码中位于`iv`之前声明,但构造函数的调用会先于`iv`的初始化。 - 接下来,`StaticCode1`类的静态初始化块执行,打印"4"。 2. **实例初始化阶段**: - 在实例化对象时,会执行实例初始化。这包括实例成员变量的初始化和非静态初始化块(如果有)。 - 在`StaticCode1`类中,实例变量`iv`的初始化会触发`InstanceVariable`的构造函数,输出"2"。这是因为`iv`需要创建一个新的`InstanceVariable`对象。 总结一下,Java初始化顺序的总览是: - 类的静态初始化块 - 类的静态成员变量(按声明顺序) - 对象的实例初始化块 - 对象的构造函数 在运行`main`方法创建`StaticCode1`的实例时,由于`b`和`Aplus`都是静态成员,它们会按照它们在类`A`中的声明顺序进行初始化。而创建`A`的实例时,将执行实例初始化步骤,包括实例变量的初始化和非静态构造函数的调用。 了解这个顺序对于避免程序中的意外行为至关重要,尤其是在依赖初始化顺序的复杂设计中。程序员应尽量避免依赖这种顺序,以提高代码的可读性和可维护性。在编写代码时,应该明确初始化逻辑,确保所有必要的初始化在需要时已经完成。

相关推荐

filetype

static int count;分数 14 知识点2:static修饰的成员变量与成员函数 作者 郑远 单位 中国民用航空飞行学院 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员 静态成员分为: 静态成员变量 * 所有对象共享同一份数据 * 在编译阶段分配内存 * 静态成员变量定义语法 static 变量类型 变量名 * 类内声明,类外初始化,初始化语法为:变量类型 类名::变量名=初始化数(整体位于类定义的外面) * 可以通过对象或类进行调用:对象.静态成员变量名或类名::静态成员变量名 静态成员函数 * 所有对象共享同一个函数 * 静态成员函数只能访问静态成员变量 * 静态成员函数定义语法:static 函数名(){} * 可以通过对象或类进行调用:对象.静态函数名()或类名::静态函数名() #include<iostream> using namespace std; class Person { public: m_A; //静态成员变量 //静态成员函数func,没有输入 { cout << "func调用" << endl; m_A = 100; //m_B = 100; //静态成员函数不可以访问非静态成员变量,这句话会报错 } private: static void func2()//静态成员函数也是有访问权限的 { cout << "func2调用" << endl; } static int m_B; //静态成员变量也是有访问权限的 }; //静态成员变量初始化,私有对象可以在外面初始化但访问不了 = 10;//初始化m_A int Person::m_B = 10; int main() { //静态成员变量两种访问方式 //1、通过对象 Person p1; = 100;//通过对象调用m_A cout << "p1.m_A = " << p1.m_A << endl; Person p2; p2.m_A = 2

elevenYears
  • 粉丝: 1
上传资源 快速赚钱