您的位置:首页 > 编程语言 > Java开发

Java 对象中变量属性的初始化时机与内存控制

2017-04-25 21:00 375 查看

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方法已经结束,但这个线程还存活。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java