不同变量的赋值时机 | 常见的面试题 | 静态代码块

简介: 这篇文章讨论了Java中不同变量的赋值时机,包括基本数据类型、引用数据类型、类变量、实例变量和局部变量,并解释了静态代码块、代码块和构造函数的执行顺序。

不同变量的赋值时机 | 常见的面试题 | 静态代码块

数据类型:
1、基本数据类型(整型、浮点型、布尔型、char型)
2、引用数据类型(类、接口、数组)

按变量在类中的位置划分:类变量(每一个new出来的对象都拥有)、实例变量、局部变量

成员变量:在使用前、都经历过默认初始化赋值。

类变量(static修饰):linkling的prepare阶段:给类变量默认赋值—>在initial阶段:给类变量显式赋值。静态代码块赋值。
【类变量表有两次初始化的机会,第一次是在准备阶段,对变量设置零值。第二次是在初始化阶段,赋予在代码中定义的初始值】

实例变量:随着对象的创建,会在堆空间中分配实例变量空间,并进行默认赋值

局部变量:在使用前,必须是显式赋值的,否则,编译不通过。(在栈中分配空间)

1、局部变量不赋初始值,编译不通过
在这里插入图片描述

2、实例变量的默认初始值

在这里插入图片描述

3、静态代码块、代码块、构造函数执行顺序

package com.zheng.demo;

public class MyTest {

    static {
        System.out.println("我是静态代码块");
    }

    {
        System.out.println("我是构造块");
    }

    public MyTest() {
        System.out.println("我是无参构造函数");
    }

    public static void main(String[] args) {
        new MyTest();
    }
}

在这里插入图片描述

子类继承父类,静态代码块、构造块、构造函数执行顺序。

package com.zheng.demo;

public class MyTest extends A {
    {
        System.out.println("我是子类的构造块");

    }

    static {
        System.out.println("我是子类的静态代码块");
    }

    public MyTest() {
        System.out.println("我是子类的无参构造函数");
    }

    public static void main(String[] args) {
        new MyTest();
    }


}

class A {
    {
        System.out.println("我是A的构造块");

    }

    static {
        System.out.println("我是A的静态代码块");
    }

    public A() {
        System.out.println("我是A的无参构造函数");
    }


}

在这里插入图片描述
在类加载器中的初始化阶段,javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来。

父类的静态代码块–>子类的静态代码块–>父类的构造块–>父类的构造函数–>子类的构造块–>子类的构造函数。

更多关于jvm参考:https://blog.csdn.net/weixin_43304253/article/details/119609324

相关文章
|
5月前
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
46 0
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
|
2月前
|
Java
【Java基础面试七】、请介绍一下实例变量的默认值
这篇文章介绍了Java中实例变量的默认值:引用数据类型的默认值是null,而基本数据类型的默认值根据其类型分别是0、0L、0.0F、0.0、'\u0000'和false。
【Java基础面试七】、请介绍一下实例变量的默认值
【IO面试题 五】、 Serializable接口为什么需要定义serialVersionUID变量?
serialVersionUID用于标识类的序列化版本,确保在反序列化时类的版本一致性,避免因类定义变更导致的不兼容问题。
|
3月前
|
存储 设计模式 监控
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
42 0
|
3月前
|
存储 JavaScript 前端开发
面试官:JS中变量定义时内存有什么变化?
面试官:JS中变量定义时内存有什么变化?
36 0
|
5月前
|
Python
2024年最新【Python】变量 的定义和使用,阿里巴巴蚂蚁金服面试流程
2024年最新【Python】变量 的定义和使用,阿里巴巴蚂蚁金服面试流程
2024年最新【Python】变量 的定义和使用,阿里巴巴蚂蚁金服面试流程
|
5月前
|
存储 JavaScript 前端开发
每日一道javascript面试题(九)函数的参数可以和函数体中的变量重名吗
每日一道javascript面试题(九)函数的参数可以和函数体中的变量重名吗
|
5月前
|
存储 Java 数据安全/隐私保护
Java基础----变量与常量【面试题拓展】
Java基础----变量与常量【面试题拓展】
77 2
|
存储 Java
第一季:1自增变量【Java面试题】
第一季:1自增变量【Java面试题】
60 0
|
SQL Java 编译器
【面试题精讲】String 类型的变量和常量做“+”运算时发生了什么?
【面试题精讲】String 类型的变量和常量做“+”运算时发生了什么?