调用,低层都是转化为通过类名来调用类变量。
实例变量的初始化时机:
程序可以在3个地方对实例变量进行初始化:定义实例变量的时候指定初始值、非静态初始化代码块中对实例变量进行初始化、
构造器中队实例变量进行初始化。例如:
public class Cat {
String name ;
int age ;
public Cat(String name , int age){
System.out.println("构造方法中");
this.name = name ;
this.age = age ;
}
{//非静态代码块,里面的变量weight没有先后顺序,不会出现向前引用错误。
System.out.println("非静态代码块正在执行");
weight = 2.0 ;
}
double weight = 2.3;
public String toString(){
return "Cat[name=" + name + ",age=" + age + ",weight=" + weight + "]" ;
}
public static void main(String[] args) {
Cat cat = new Cat("kitty" , 2) ;
System.out.println(cat);
Cat c2 = new Cat("tom" , 3) ;
System.out.println(c2);
}
}
程序的运行结果为:
非静态代码块正在执行
构造方法中
Cat[name=kitty,age=2,weight=2.3]
非静态代码块正在执行
构造方法中
Cat[name=tom,age=3,weight=2.3]
当调用类构造器来创建java对象的时候,该类所包含的非静态代码块总是在构造器执行之前获得执行。从程序的运行结果可以看出
两只猫的weight都是2.3,这是因为在定义weight的时候指定了初始值,它和非静态代码块中的操作与他们在源代码中的排列顺序有
关,在程序中,先将weight初始化为2.0,然后又将weight初始化为2.3,所以最后weight的值为2.3。
如果将double weight = 2.3;此行代码放到非静态代码块的前面,则程序的运行结果为:
非静态代码块正在执行
构造方法中
Cat[name=kitty,age=2,weight=2.0]
非静态代码块正在执行
构造方法中
Cat[name=tom,age=3,weight=2.0]
由此可以看出,定义变量时候的初始值和非静态代码块中的值的先后顺序会影响变量最后的值。
public class Cat {
String name ;
int age ;
public Cat(String name , int age){
System.out.println("构造方法中");
this.name = name ;
System.out.println(weight);
this.age = age ;
}
{//非静态代码块,里面的变量weight没有先后顺序,不会出现向前引用错误。
System.out.println("非静态代码块正在执行");
weight = 2.0 ;
}
double weight = 2.3;
public String toString(){
return "Cat[name=" + name + ",age=" + age + ",weight=" + weight + "]" ;
}
public static void main(String[] args) {
Cat cat = new Cat("kitty" , 2) ;
System.out.println(cat);
Cat c2 = new Cat("tom" , 3) ;
System.out.println(c2);
}
}
运行结果为:
非静态代码块正在执行
构造方法中
2.3
Cat[name=kitty,age=2,weight=3.0]
非静态代码块正在执行
构造方法中
2.3
Cat[name=tom,age=3,weight=3.0]
非静态代码块——>实例变量(定义变量时候的初始值和非静态代码块中的值的先后顺序会影响变量最后的值)——>构造方法