Java 对象与内存控制
1.java变量可以分成员变量和局部变量
局部变量:随入栈活,出栈消亡,存储在栈中
形参: 在方法签名中定义:void (int a){} ,在调用时初始化
方法体内局部变量: 必须显示初始化
代码块中的局部变量:必须显示初始化
成员变量(field)
没有使用static修饰的叫实例变量or非静态变量,属于该类的对象实例,对象
使用static修饰的叫类变量or静态变量,属于类本身。
tips:就如在main方法中实例变量必须实例对象才能调用,而类变量可以直接调用
2. 实例变量的初始化的时机
a.定义的实例变量的指定初始值b.非静态初始化中对实例变量指定初始值
c.构造器对实例变量的初始值
其中a,b早与c执行,a,b执行顺序与源程序排列顺序相同,每new一个实例对象就要在堆区开辟一个新区域存放实例变量
3.类变量的初始化时机
当加载一个类的时候,是按照a,找到变量在内存中分配内存,并按类型默认附初值null,0,0.0,false
b,按顺序加载静态代码块代码块和要赋值的静态变量
c,按顺序加载普通代码块和要赋值的实例变量
d,构造器执行
public class Dtest {
public static void main(String[] args) {
System.out.println(D.D_STATIC.c);
D d = new D(2.8);
System.out.println(d.c);
}
}
class D{
final static D D_STATIC = new D(2.8); //在执行这一步D_STATIC=new D(2.8) 的时候,i 和c 都只是分配内存并默认附默认值null,0.0,0.0,所以执行的时候i=0.0。
static double i = 20; // 在a 附值0.0 ,在b赋值20.0
double c; //只在a执行
public D(double a){
c= i-a;
}
}
public class C {
{
gender = "famale";
name = "Java";
System.out.println("staticname=" + this.name);
System.out.println("staticgender=" + this.gender);
}
String name;
String gender = "male";
public static void main(String[] args) {
C c = new C();
System.out.println("name=" + c.name);
System.out.println("gender=" + c.gender);
}
}
final 关键字的使用
在final修饰的变量,不管他是类变量,实例变量还是局部变量,只要定义该变量指定了初始值,在编译后就不能在被修改。(1.)
final 可以修饰变量 : 在赋值以后不能在修改值
final 可以修饰方法 : 被final修饰的方法不能被重写
final 可以修饰类 : 被final修饰的类不能派生出子类
(2.)
final 对实例变量的初始化值可以在
a,在定义的时候赋值
b,在非静态初始化代码块指定值
c,在构造器初始
(3.)
final 对类变量的初始化可以在
a,在定义的时候赋值
b,在静态代码块中指定初始值
(4.)
在内部类中要调用外部的局部变量,需要将局部变量定义成final,因为可以出现该变量的值随意改变从而将引起混乱,因此java编译器要求所有的被内部类访问的局部变量必须使用final修饰。 如: new Thread(){ } ,main方法已经结束,但这个线程还存活。