面试题--基础的表现


这是一道基础面试题,能做出来证明你的java基础不错,很多半道出家的估计就会被难道了。
public class InitVarTest {
public static void main(String[] args) {
Cat cat = new Cat("Java后端技术栈", 21);
System.out.println(cat);
Cat cat1 = new Cat("lawt", 23);
System.out.println(cat1);
}
}
class Cat {
String name;
int age;
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
{
System.out.println("");
weight = 2.0;
}
double weight = 2.3;
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
", weight=" + weight +
'}';
}
}
答案下面会给出。
对于实例变量来说,他属于Java对象的本身,每次程序创建java对象的时候都需要对实例变量分配内存空间,并执行初始化。另外如果从语法角度来看,程序可以在三个地方对实例变量执行初始化:
- 定义实例变量时候指定初始值
- 非静态模块中堆实例变量指定初始值
- 构造器中堆实例变量指定初始值
其中第1、第2方式比第3中方式更早执行,即就是定义时指定初始化值和非静态模块指定初始值比构造器中指定初始值**更早执行。
第1和第2两种方式的执行顺序是与他们在源码中排列顺序相同。
初始化第一个Cat对象后的内存分配如下

初始化第二个Cat对象时内存分配情况
很多人看到上面的程序时可能会感到很奇怪,会认为执行创建Cat对象后weight实例变量的值应该是2.0,而不是2.3,因为他们会认为double weight=2.3的代码先执行,但是事实并不是这样的。定义变量时指定的初始化值和初始化模块中指定的初始值的执行顺序与他们在源码中排列顺序相同。
文初的题目的答案:
