一、java程序的变量大体可以分为:成员变量、局部变量
局部变量:
1、形参:在方法签名中定义的局部变量,由方法调用者负责为其赋值,随方法的结束而消亡。
2、方法内的局部变量:在方法内定义的局部变量,必须在方法体内对其进行显式初始化。这种类型的局部变量从初始化完成后开始生效,随方法的结束而消亡。
3、代码块内的局部变量: 在代码块内的局部变量,必须在代码块内对其进行显式初始化。这种类型的局部变量从初始化完成后开始生效,随方法的结束而消亡。
它们作用的时间很短,被存储在方法的栈内存中。
成员变量:
1、类变量(静态变量):使用static修饰
2、实例变量(非静态变量):没使用static修饰
表面上看,java类里定义成员变量不需要先后顺序,但实际上,java要求定义成员变量时必须采用合法的前向引用。换句话说,当你使用某个引用时,该引用应当指向某一内存空间。类变量先于实例变量被初始化。
在同一个JVM内,每个类只对应一个class对象。因此,同一个JVM内的一个类的类变量只分配一块内存空间。而对于实例变量来说,该类没创建一个实例,就需要为实例变量分配一块内存空间。
大部分时候会把类和对象严格的分开,但从另外一个角度看,类也是对象。所有类都是Class的实例。每个类初始化后,系统都会为该类创建一个对应的Class实例。程序可以通过反射来获取某个类所对应的Class实例。
例如,要获取Person类对应的Class实例,通过Person.class,或者Class.forName("Person"),来获得。
二、变量的初始化
实例变量初始化:
1、可以在定义实例变量时指定初值
2、可以在非静态初始化代码块中对实例变量进行初始化
3、可以在构造器中对实例变量指定初值
其中第1、2种方式比第3种方式先执行,而第1、2种方式的执行顺序则跟它们在源程序中的顺序有关。
public class VariableDemo {
public static void main(String[] args) {
Person per = new Person("阳光的味道3",3);
System.out.println(per.name);
System.out.println(per.age);
}
}
class Person{
//在定义实例变量时指定初值
int age = 1 ;
//在非静态初始化代码块中对实例变量进行初始化
{
int age = 2 ;
System.out.println("执行了非静态代码块");
}
String name = "阳光的味道1";
//在构造器中对实例变量指定初值
Person(String name , int age ){
this.name = name ;
this.age = age ;
System.out.println("执行了构造器");
}
}
/*out:
执行了非静态代码块
执行了构造器
阳光的味道3
3*/
类变量的初始化:
1、可以在定义类变量时初始化
2、可以在静态初始化代码块中初始化
执行顺序与代码顺序相同。