内存分配-java中非静态成员变量和构造代码块的先后加载问题

问题描述

java中非静态成员变量和构造代码块的先后加载问题
如果在java中同时存在构造代码块和非静态成员变量,请问他们的先后加载顺序?是顺序加载么?

例如:
public Test{
{
a =2.4f;
System.out.println("构造代码块");
}

float a =100;
public static void main(String[] args) {
  System.out.println(new Test().a);

}
}
结果a = 100.0

public Test{

float a =100;

{
a =2.4f;
System.out.println("构造代码块");
}

public static void main(String[] args) {
  System.out.println(new Test().a);

}

}
结果 a = 2.4 为什么呢?

解决方案

非静态代码块,以及非静态成员变量是在实例化的时候按照代码顺序执行的。

建议搞不清楚的时候可以使用javap -c Test来查看字节码就知道执行的书序了,比如你的代码的第一种情况,查看字节码为:

Code:
0: aload_0
1: invokespecial #10; //Method java/lang/Object."":()V
4: aload_0
5: ldc #12; //float 2.4f
7: putfield #13; //Field a:F
10: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream;
13: ldc #21; //String 代码块
15: invokevirtual #23; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
18: aload_0
19: ldc #29; //float 100.0f
21: putfield #13; //Field a:F
24: return

这样就能够看清楚执行的顺序了。

时间: 2024-08-28 21:50:18

内存分配-java中非静态成员变量和构造代码块的先后加载问题的相关文章

JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块

JAVA之旅(四)--面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块 加油吧,节奏得快点了 1.概述 上篇幅也是讲了这点,这篇幅就着重的讲一下思想和案例 就拿买电脑来说吧,首先,你不懂电脑,你去电脑城买电脑,和大象装冰箱里一样,是什么步骤?咨询 砍价 ,谈妥了就那电脑走人,对吧,这就是面向过程的思想,而面向对象是:你有一个哥们,他懂电脑,什么都会,你只要带他去,就行,你这个哥们就是对象,在JAVA中,我们就是操作一个对象去完成各种各样的操作的,这就是面向对

深入浅析Java中普通代码块、构造代码块与静态代码块_java

//执行顺序:(优先级从高到低.) 静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1.普通代码块 public static void main(String[] args) { /*普通代码块: *直接定义在在方法或语句中出现"{普通代码的执行语句}"的就称为普通代码块. *普通代码块执行顺序由他们在代码中出现的次序决定--"先出现先执行" * */ { System.out.p

java中的静态代码块、构造代码块、构造方法详解_java

运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System.out.println("I'm B class"); } static { System.out.println("static B"); } public static void main(String[] args) { new HelloB(); } } cla

代码分析-一道Java笔试题,求解答(关于类的加载与初始化)

问题描述 一道Java笔试题,求解答(关于类的加载与初始化) 自己查了一些资料,还是看不懂这个程序的输出结果,求各位详细解释初始化和执行过程,谢! public class Alibaba { public static int k = 0; public static Alibaba t1 = new Alibaba("t1"); public static Alibaba t2 = new Alibaba("t2"); public static int i =

java 中的静态方法和静态代码块分别装载到哪个区

问题描述 java中的静态方法和静态代码块分别装载到哪个区 解决方案 解决方案二: 解决方案三:楼主可看看楼上说的挺好学习了顶解决方案四:应该是栈里解决方案五:方法都是在方法区中,无论是不是静态的.方法表中有一个代码属性,代码属性存放方法代码.解决方案六:好,收了解决方案七:谢谢1楼的,学习了!

java-怎么获取一个JAVA类中各个方法的代码块

问题描述 怎么获取一个JAVA类中各个方法的代码块 特殊需求:获取一个JAVA类中各个方法的代码块来查找方法中是否包含某个关键字,现在通过发射只能拿到方法的属性和注释,有没有API或者其他方法,求告知,3Q 没金币了..对不起大家 PS:获取本地源代码的,不是运行时的class 解决方案 myeclipse中调试调用带有静态代码块的类时出现java.lang.NoClassDefFoundError的处理方法在DWR中实现直接获取一个JAVA类的返回值的两种方法java代码获取当前类类名.方法名

java System.loadLibrary("xx"); ,如何加载类路径下的某个dll, 现在有异常UnsatisfiedLinkError

问题描述 用设置环境变量参数的方法可以 问题补充:niuzai 写道 解决方案 人家写的,那你就只好乖乖的放到你的JAVA_HOME/bin下面咯~ 你要想指定路径加载就System.load(加载dll全路径);解决方案二:笔误,本质上调用ClassLoader.loadLibrary(Class fromClass, String name,boolean isAbsolute);解决方案三:亲,再给你说明白点哟.load方法可以加载绝对路径,loadLibrary方法直接调用dll文件名!

静态代码块,构造代码块,局部代码块演示

public class Test{         static int num;    static int numObj;//记录有多少个对象产生!    static{//静态代码块, 是用来给类进行初始化的!        //num = 10;        ++num;        num *=12;//没有进入静态代码块之前,num的初始化值是0        System.out.println(num);        //main(null);//静态代码块中可以调用ma

对象内存分配-Java对象中的对象如何分配内存?

问题描述 Java对象中的对象如何分配内存? 在Java中,比如A a=new A ();是在堆内存中创建了一个对象,然后把这个对象的引用传递给栈内存中的对象变量a.那如果a对象拥有一个字符串对象,那a对象中保存的是这个字符串对象的引用吗? 解决方案 a是A类型的.不能拥有一个字符串对象. 如果A中有一个字符串字段,那一样的,堆上的a中存储着指向这个字符串的引用.字符串本身则放在常量池或者也在堆上. 解决方案二: 不知道是不是这个意思:将字符串对象符值给a,这是不可以的,除非是相同类型,如果A是