JAVA-初步认识-第六章-成员变量和局部变量的显示初始化
一.
这就是说,描述类中出现了同名的成员变量和局部变量,接着在创建类中,对相同名称的变量进行赋值,最后输出,结果是怎样的?→这个变量的作用范围有关。
Dos的结果显示为10,我有些不明白,在变量创建类中,不是重新对实体对象进行了赋值么,虽然c调用了描述类中的函数,但本质不应该还是对象么?
解析:当调用方法的时候,方法需要进栈。方法一进栈的话,方法进栈后就分配一个变量num=10,是局部变量。当方法进行输出的时候,它所属的栈当中就有num,那就直接输出这个num。如果描述类的方法中没有num,在栈里面没找着,那就到堆里面去寻找num。如果堆里面也没有,那就直接报错。
核心:自己所属内存区域有东西,就不用出去找了。
上面的讲解说明一个问题,创建对象的类完全是依赖于描述对象的类。这里有一些疑问。对于创建对象的类在计算机中的过程,我们是了解的,但是描述事物的类在计算机中是怎样的情况,我们是不清楚的。
我们现在思考一下这个程序在计算机中的流程。这仅是个人理解,不一定对。由于创建对象的类中有主函数,那么开始加载入内存的应该是CarDemo,创建对象的类。我们先不看c.num=4; c.color=”red”; 这两个语句。c这个变量是在栈中的,它是属于主函数的局部变量,当然也会叫做类类型引用变量。同时堆内存中也会依照描述类中的描述,在堆内存中开辟Car类型的类,将其堆内存的地址给c局部变量。c会根据地址去堆内存中搜寻数据。至于描述类中的void main函数的位置是在哪呢?功能函数不清楚存放在哪个内存中,当运行c.run()时,是在调用函数,函数中的执行语句是输出num和color变量。由于是c调用的,c引用的是堆内存中的Car(),Car()中有根据描述类加载的变量num和color。这时调用输出,自然是输出Car()中的数据。如果是run()方法中已经有定义的num,和方法要有的输出变量一致,那么c在调用方法时,c.run()就直接按照方法中的执行语句,没有输入,直接输出num=10。这样一来就和描述类中的属性没有任何关联性。→这里得出的结论就是,描述;类中的成员变量和函数是独立,有些时候,函数中的执行语句会和成员变量搭上关系。一定要通过调用方法来输出成员变量么?可以直接输出。
二. 显示初始化
所有的小汽车都要是四个轮子,在描述类中直接固定了num=4,。这样一来,在对内存中开辟Car()空间,并建立num和color时,num的初始值就为4。之前的num=0叫做默认初始化值,这里的叫做显式初始化值。