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是成员变量

大佬,代码中方法块变量没定义也可以赋值吗?

如果我的回答解决了你的问题,麻烦结贴给点积分,谢谢^_^

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-08-30
  • 2021-06-14
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-07
  • 2022-12-23
  • 2022-03-10
相关资源
相似解决方案