public class Demo {
{
a = 10;
}
int a=0;
public static void main(String[] args) {
System.out.println(new Demo().a);
}
}
//a没定义为什么没报错
你有点误解。a是声明了的。
成员变量按照其声明的顺序会被初始化,这个动作发生在所有事件之前,也就是编译器会在使用类的时候立刻将非静态成员变量初始化。
然后才是非静态初始化块。(非静态初始化块执行的时候其实是放在构造函数里最先执行的,然后才是构造函数里的赋值语句)
所以你的代码其实可以改成这样:
public class Demo
{
{
a = 10;
}
int a;
{
a = 0;
}
public static void main(String[] args)
{
System.out.println(new Demo().a);
}
}
执行顺序其实是int a; a = 10; a = 0;
还有,按照C++,严格来说 int a;这种叫做变量的声明。 a = 0才叫做变量的定义。
在编译的时候就声明了a的变量吗?
也就是说赋值块不需要分配内存才能给值,只是在编译的时候做个保存。资源下载实际运行的时候是不会涉及赋值块也就不会报错。是这样吗?
18.栈内存,堆内存
・栈内存:基本数据类型,对象地址的引用,局部变量,方法运行时方法的代码。
・堆内存:new 所创建出来的对象
・常量池 : public static final (JDK 1.7之后,String 常量池被移动到了堆内存中)
・方法区:class文件的内容,即我们写的代码
(java程序运行时,通过类加载器,载入类对应的字节码信息,经过解析后,将其放入方法区。
类中的各种信息,包括方法都在这里存储。)
方法仅仅是一种逻辑片段而已(方法是看不见摸不着的,它仅仅是一种逻辑操作)
方法在不执行的时候不占用内存空间,只有在执行的时候才会占用内存空间。
我们可以说,每个类实例出来的对象,拥有不同的属性(成员变量)
但是不能说,对象,拥有某个方法。
比如说,People这个对象,有age属性,eat()方法。
每个人都年龄是不同的,但是每个人,都可以进行吃这个动作。
年龄属于对象,而eat是人的一个属性,是类的一个逻辑片段。
当,每个人的,eat方法执行时,会分别栈区,开辟出一段内存空间,
用于执行这段代码,
a是成员变量
如果我的回答解决了你的问题,麻烦结贴给点积分,谢谢^_^