当前位置: 首页 > wzjs >正文

做黄色网站的人不犯法吗seo网络推广经理招聘

做黄色网站的人不犯法吗,seo网络推广经理招聘,投票网站怎么做的,如何把自己做的网站分享给别人用Java类的实例化过程及初始化顺序 Java类的实例化过程涉及多个步骤,特别是在存在继承关系和静态成员的情况下。下面我将详细解释整个过程,包括JVM在其中的角色。 1. 类加载阶段(JVM的工作) 在实例化一个类之前,JVM首…

Java类的实例化过程及初始化顺序

Java类的实例化过程涉及多个步骤,特别是在存在继承关系和静态成员的情况下。下面我将详细解释整个过程,包括JVM在其中的角色。

1. 类加载阶段(JVM的工作)

在实例化一个类之前,JVM首先需要加载这个类:

  1. 加载:JVM查找并加载类的二进制数据(.class文件)

  2. 验证:确保加载的类正确无误,符合JVM规范

  3. 准备:为类的静态变量分配内存,并设置默认初始值(0, null, false等)

  4. 解析:将符号引用转换为直接引用

  5. 初始化:执行类的静态初始化代码和静态变量初始化

2. 实例化过程顺序(包含继承)

当使用new关键字创建对象时,完整的初始化顺序如下:

父类静态成员和静态代码块

  1. 父类的静态变量初始化

  2. 父类的静态代码块(按代码中的顺序执行)

子类静态成员和静态代码块

  1. 子类的静态变量初始化

  2. 子类的静态代码块(按代码中的顺序执行)

父类实例成员和构造代码块

  1. 父类的实例变量初始化

  2. 父类的构造代码块(按代码中的顺序执行)

  3. 父类的构造函数(如果没有显式调用其他构造函数,则调用默认无参构造)

子类实例成员和构造代码块

  1. 子类的实例变量初始化

  2. 子类的构造代码块(按代码中的顺序执行)

  3. 子类的构造函数

3. JVM在实例化过程中的工作

在整个实例化过程中,JVM负责:

  1. 内存分配:为对象和它的实例变量分配堆内存

  2. 初始化默认值:将所有实例变量设置为默认值(0, null, false等)

  3. 方法表设置:为对象设置方法表(用于动态绑定和多态)

  4. 执行初始化代码:按照上述顺序执行各种初始化代码

  5. 构造器链调用:确保父类构造器在子类构造器之前被调用

  6. 处理多态:在运行时确定实际要调用的方法版本

4. 示例代码

class Parent {static {System.out.println("Parent static block");}{System.out.println("Parent instance block");}Parent() {System.out.println("Parent constructor");}
}class Child extends Parent {static {System.out.println("Child static block");}{System.out.println("Child instance block");}Child() {System.out.println("Child constructor");}
}public class Main {public static void main(String[] args) {new Child();}
}

输出顺序:

Parent static block
Child static block
Parent instance block
Parent constructor
Child instance block
Child constructor

5. 特殊情况

  • 如果类中有多个静态变量和静态代码块,它们按照在代码中出现的顺序执行

  • 实例变量和构造代码块也是按照代码中的顺序执行

  • 如果构造函数中显式调用了其他构造函数(this()或super()),则先执行被调用的构造函数

  • 如果父类没有无参构造器,子类必须显式调用父类的某个构造器(super(...))

理解这些初始化顺序对于避免NullPointerException和其他初始化相关的问题非常重要,特别是在复杂的继承层次结构中。

关于 Java 类的实例化过程

✅ 整体顺序正确,但可以补充一些关键细节:

需要修正/补充的点:

  1. 静态初始化(JVM 类加载阶段)

    • 静态变量和静态代码块的初始化顺序 仅发生在类首次被主动使用时(比如 new、访问静态成员、Class.forName() 等),而不是在程序启动时全部加载。

    • 如果类已经被加载过(比如之前已经调用过静态方法),则不会再次执行静态初始化。

  2. 实例初始化

    • final 实例变量 的初始化必须在构造函数完成之前完成,否则编译错误。

    • 如果类没有显式构造函数,JVM 会提供默认无参构造,但如果父类没有无参构造,子类必须显式调用 super(...),否则编译失败。

  3. JVM 的隐含操作

    • 在构造函数真正执行前,JVM 会 隐式初始化所有实例变量为默认值0/null/false),然后才执行显式赋值或初始化块。

    • 如果存在 实例变量直接赋值(如 int x = 5;),这些赋值会在构造代码块之前执行。

示例修正:

class Parent {static { System.out.println("Parent static block"); }{ System.out.println("Parent instance block"); }Parent() { System.out.println("Parent constructor"); }
}class Child extends Parent {static { System.out.println("Child static block"); }{ System.out.println("Child instance block"); }int x = initX(); // 这个会在实例块之后执行吗?❌ 实际在实例块之前!Child() { System.out.println("Child constructor"); }private int initX() { System.out.println("Initializing x"); return 1; }
}public class Main {public static void main(String[] args) {new Child();}
}

实际输出:

Parent static block
Child static block
Parent instance block
Parent constructor
Initializing x  // 变量初始化在实例块之前!
Child instance block
Child constructor

1. final 实例变量必须在构造函数完成前初始化(否则编译错误)

final 实例变量必须在 对象构造完成前 被赋值,且只能赋值一次。有三种方式初始化:

  1. 声明时直接赋值

  2. 在实例初始化块中赋值

  3. 在每个构造函数中赋值

class FinalExample {final int x;          // ❌ 如果不初始化,编译报错final int y = 10;     // ✅ 方式1:声明时赋值final int z;{ z = 20; }           // ✅ 方式2:实例初始化块赋值FinalExample() {x = 30;           // ✅ 方式3:构造函数中赋值}FinalExample(int val) {x = val;         // ✅ 另一个构造函数也必须赋值}
}
错误示例:
class FinalError {final int x;  // ❌ 编译错误:未初始化final变量xFinalError() {// 忘记给x赋值}
}

2. 父类没有无参构造时,子类必须显式调用 super(...)

如果父类 没有无参构造,子类 必须 在构造函数的第一行显式调用 super(...),否则编译失败。

示例代码:
class Parent {Parent(int value) {  // ❗父类只有带参构造,没有默认无参构造System.out.println("Parent constructor: " + value);}
}class Child extends Parent {Child() {super(10);  // ✅ 必须显式调用父类构造,否则编译错误System.out.println("Child constructor");}
}public class Main {public static void main(String[] args) {new Child();}
}
输出:
Parent constructor: 10
Child constructor
错误示例:
class Child extends Parent {Child() {  // ❌ 编译错误:父类Parent中没有默认构造函数System.out.println("Child constructor");}
}

关键总结

  1. final 实例变量

    • 必须且只能赋值一次。

    • 必须在构造完成前初始化(三种方式选其一)。

  2. 构造函数继承规则

    • 如果父类 没有无参构造,子类 必须显式调用 super(...)

    • 如果父类有无参构造,子类可以不写 super()(JVM 会隐式调用)。

这些规则由 Java 语言规范(JLS) 强制约束,编译器会严格检查。

    http://www.dtcms.com/wzjs/357326.html

    相关文章:

  • 如何给网站做轮播图营销推广软件
  • 一个人搞得定网站建设网站下载免费软件
  • 搭建一个简单的网站做网络推广有前途吗
  • 多语言外贸网站源码网络公司网页设计
  • it运维工资多少刷seo关键词排名软件
  • 手机怎么做弹幕小视频网站电脑版百度网盘
  • wordpress用户邮箱验证浙江专业网站seo
  • 网站核验为个人实际是公司蚁百杭州网站seo优化
  • 有哪些做网游单机版的网站互联网营销平台
  • 美国打不开国内网站百度应用下载
  • 黑龙江省城乡建设厅网站首页大连最好的做网站的公司
  • 群晖wordpress更新下载失败seo好学吗入门怎么学
  • 广州番禺服装网站建设谷歌推广代理商
  • dw怎么做购物网站长春网站seo
  • 做爰午夜福利全过程视频网站整站seo排名
  • 徐州自助建站模板八百客crm系统登录入口
  • 建筑设计网上课程成都高薪seo
  • 狠狠做最新网站陕西网页设计
  • 上海网站建设海淘科技网站建设建站在线建站
  • 做窗帘的效果图网站网站推广网络推广
  • 网站建设手机网站网站怎么优化到首页
  • 香河县住房和城乡建设局网站北京百度推广客服电话多少
  • 昆明新冠疫情最新情况厦门seo排名收费
  • 旅行网站建设的规划书杭州百度推广电话
  • 龙岗区住房和建设局网站seo网站优化排名
  • 整站优化该怎么做口碑营销的案例
  • 必应网站首页的图片怎么做的百度登录
  • 网站如何做漂浮窗交易平台
  • 网站开发维护成本计算网页优化seo广州
  • 网站运营暂停百度招商加盟