`
血腥小苹果
  • 浏览: 3205 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

final字段的初始化过程

 
阅读更多
首先final字段是一经初始化就无法改变的。
其他属性就不说了。
final分为static和非static的。
先说非static的final。
final int i = 10;

看下面的一段代码:
class ATest {
	final int i;

	ATest() {
		i=10;
	}
}

这里调用的是构造器进行对final字段初始化
问题出现了:类进行实例化的时候的先初始化变量也就是这里的“i”;而在这里i并没有给予赋值。也就是一旦定义就无法改变其值。那岂不是和final的定义发生矛盾了吗
其实不然,经过这几天的摸索其实并不是这样运行的:
在实例化ATest类时。也就是
new ATest();

时。运行了一系列过程。
1、对类ATest进行加载——初始化ATest类中的static域。而构造器也是静态方法。所以会对构造器初始化。对构造器中成员i的值指向10;但不知道类型。其中10在静态域中。i在栈中;
2初始化:先初始化变量(i)给i划分int类型的空间。指向值10。
这样就给final int i的值确定了。
对于static final 只有在static域中才能对其初始化。也就是加载类的时候开辟空间对其初始化。好理解
我也是半猜。希望大家指出错误。
0
1
分享到:
评论

相关推荐

    java程序初始化顺序

    - 当多个线程同时尝试初始化同一个类时,Java保证只会执行一次类的初始化过程。这是由JVM的同步机制保证的,避免了数据竞争的问题。 5. **接口初始化**: - 接口没有实例变量,所以不存在实例初始化阶段。接口的...

    深入理解final变量的初始化

    总结来说,`final`变量的初始化必须在定义时、构造函数中或者初始化代码块中进行,并且要遵循特定的顺序和规则。理解这些规则对于编写健壮和可靠的Java代码至关重要。在编写涉及`final`变量的代码时,应特别注意初始...

    C++和Java初始化顺序的比较代码

    // 静态字段初始化 static { a = 2; // 静态初始化块 } final int b = 3; // 常量字段 int c; { c = 4; // 实例初始化块 } public MyClass() { c = 5; // 构造器 } } ``` 在这个Java示例中,`a` 的值...

    Static和Final修饰类属性变量及初始化

    1.static修饰一个属性字段,那么这个属性字段将成为类本身的资源,public修饰为共有的,可以在类的外部通过test.a来访问此属性;在类内部任何地方可以使用.如果被修饰为private私有,那么只能在类内部使用.

    java对象初始化代码详解

    4. 成员字段初始化:所有基本类型(Primitive)设为它们的默认值(0 用于数字,以及 boolean 和 char 的等价设定)。 5. 实例变量初始化:一共有三种方式对实例变量进行初始化:①定义实例变量时指定初始值②非静态...

    Java中的final关键字

    - 在多线程环境下,`final`字段具有特殊的含义,它们可以被JVM保证初始化的安全性。一旦对象的构造完成,`final`字段的值就会被锁定,不会受到并发的影响。 7. **final和效率** - Java虚拟机(JVM)可以对`final`...

    解析Java虚拟机中类的初始化及加载器的父委托机制共14页

    - 访问类的静态字段(不包括被final修饰且已初始化的常量)。 - 调用类的静态方法。 - 反射调用类的构造器、字段或方法。 - 初始化子类时,会先初始化父类。 - JSP应用加载对应页面的类。 三、加载器的父委托机制 ...

    java关键字:final--稍微深入研究其使用方法

    - `final`字段也满足Java内存模型(JMM)的"初始化完成"条件,这意味着其他线程能正确地看到`final`字段的初始化值。 6. **`final`与`this`引用** - 在构造器中,`final`关键字可以用于限制`this`的使用,防止...

    JavaMore:初始化添加

    5. **枚举类型初始化**:枚举是Java中的特殊数据类型,它们有自己的初始化过程,包括定义枚举常量并可选地包含一个初始化块。 6. **数组初始化**:Java支持两种数组初始化方式:声明时初始化和声明后初始化。例如,...

    深入解析Java编程中final关键字的使用

    如代码所示,当`thingie`在try-catch块中初始化时,编译器可能会报错,认为final字段未被初始化。为解决这个问题,可以使用临时变量`tempThingie`,先在try块中初始化,然后在catch块中将其赋值给final字段。这样,...

    12.虚拟机的加载机制1

    * 使用final修饰的字段,已经在编译期把结果存放到常量池中,因此不会主动初始化。 虚拟机的加载机制是将类加载到内存中,并对数据进行校验、转换、解析和初始化,以便虚拟机使用。类加载的生命周期包括七个阶段,...

    java中final和static的总结

    3. **静态初始化块**:静态初始化块在类加载时执行,用于初始化静态变量。 4. **静态导入**:可以使用`import static`导入类的静态成员,避免每次使用时都需要带上类名。 结合`final`和`static`,我们可以创建常量...

    修复JAVA内存模型1

    2. **Final字段的不确定性**:在旧的JMM中,final字段的初始化在构造函数中完成后可能未被正确地锁定,导致其他线程在构造过程完成前看到不一致的初始值,破坏了final字段的预期行为,即一旦初始化,其值就不能改变...

    java类加载过程详解.doc

    a) 初始化的时机:类或接口会在首次主动使用时被初始化,包括创建类实例、调用静态方法、访问静态字段(非final)、反射、启动类等六种情况。被动使用类不会触发初始化。 b) 初始化的具体行为:执行类变量初始化...

    final关键字

    `final`修饰的成员变量可以确保在构造函数完成后立即初始化,这样在并发环境中,所有线程都能看到一致的初始化状态。 综上所述,`final`关键字在Java编程中具有多方面的功能,包括但不限于创建不可变对象、防止方法...

    Java this、final等关键字总结

    对于类变量,`final`变量必须在静态初始化块中初始化;对于实例变量,可以在构造器中初始化。未初始化的`final`变量会导致编译错误。`final`关键字也可用于方法,这意味着该方法不能在子类中被覆盖,保持了方法的...

    第16章 反射2

    举例来说,考虑两个类`Base`和`TestClinit`,它们的初始化顺序和静态变量的初始化过程如下: - `Base`类的静态变量`a`首先通过`getNum()`初始化,然后在两个静态代码块中被递增。 - `TestClinit`类继承自`Base`...

    final关键字和static_用法

    // final空白, 必须在初始化对象的时候赋初值 public Test3(int x) { E = x; } public static void main(String[] args) { Test3 t = new Test3(2); // t.A = 101; // 编译错误, final变量的值一旦给定就...

    Java基础知识精华总结

    #### 继承时对象的初始化过程 当一个类继承自另一个类时,对象的初始化遵循以下步骤: 1. 超类(基类)的静态成员初始化。 2. 子类的静态成员初始化。 3. 超类的非静态成员初始化。 4. 子类的非静态成员初始化。 5...

Global site tag (gtag.js) - Google Analytics