`
C_SHaDow
  • 浏览: 49830 次
  • 性别: Icon_minigender_1
  • 来自: 大同
社区版块
存档分类
最新评论

Java内存分配

 
阅读更多

变量可大致分为局部变量和成员变量。局部变量分为形参、方法内的局部变量和代码块内的局部变量(后两者必须显示初始化),作用时间短暂,它们都被储存的方法的栈内存中。类内定义的变量被称作成员变量,根据有无被static关键字修饰分为非静态变量(实例变量)和静态变量(类变量)。

Static只能修饰在类里定义的成员部分,包括成员变量、方法、内部类、初始化块、内部枚举类,不能修饰外部类,不能修饰局部变量、局部内部类。

 

从语法角度来看,程序可以在3个地方对实例变量执行初始化:

l  定义实例变量时指定初始值;

l  非静态初始化块中对实例变量指定初始值;

l  构造器中对实例变量指定初始值。

当经过编译处理之后,它们都将被提取到构造器中,在为变量分配内存之后。

同理,对静态变量的初始化经过编译后都将被提取到静态初始化块中,在为变量分配内存之后。

构造器只是负责对Java对象实例变量执行初始化,在执行构造器代码之前,该对象所占的内存空间已经被分配下来,保存的是空值。

 

子类构造器执行中既没有super调用,也没有this调用,系统将会在执行子类构造器之前,隐式调用父类无参数的构造器。

 

当变量的编译时类型和运行时类型不同时,通过该变量访问它引用的对象的实例变量时,该实例变量的值由声明该变量的类型决定。但通过该变量调用它引用的对象的实例方法时,该方法行为将由它实际所引用的对象来决定。

Java继承在处理成员变量和方法时是有区别的。

 

当程序创建一个子类对象时,系统不仅会为该类中定义的实例变量分配内存,也会为其父类中定义的所有实例变量分配内存,即使子类定义了与父类中同名实例变量。

 

对于一个使用final修饰的变量而言,如果定义该final变量时就指定初始值,而且这个初始值可以在编译时就确定下来,那么这个final变量将不再是一个变量,系统会将其当成“宏变量”处理。也就是说,所有出现该变量的地方,系统将直接把它当成对应的值处理。

如果final变量的赋值表达式是直接量、基本的算数表达式或字符串连接运算,没有访问普通变量,调用方法,Java编译器就会将其当成“宏变量”处理。

 

如果父类某个方法使用的final修饰符进行修饰,那么这个方法将不可能被它的子类访问到,因此这个方法也不可能被它的子类重写。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics