java类的内存分配机制
来源:互联网 发布:网络机柜跳线是什么 编辑:程序博客网 时间:2024/05/29 09:00
要是改变初始化与域的位置,输出结果也会有相应改变,同样静态(或非静态)的初始化和域,基本按照先后顺序执行。
结论是:
1)静态元素(变量、方法、域、内部类)不能直接调用非静态元素 ,需要对非静态元素所属类实例化,特别是调用非静态内部类时,需要对其外部类实例化,然后获取非静态内部类的实例对象。
2)不管位置如何,静态初始化 / 域先于非静态初始化 / 域,父类的初始化 / 域先于子类的初始化 / 域,变量的初始化以及域先于构造方法执行。即:
a) 先初始化 / 域,后构造方法;
b) 先“静态”后“非静态”;
c) 先父后子。
其他静态 / 非静态方法均需调用才能执行
这里请注意次序排列的先后顺序,比如静态非静态的区分先于父子类的区分,即子类的静态初始化比父类的非静态初始化优先的。
3)静态方法在第一次被执行时,会先执行静态的初始化和域,如所属类的main方法,构造方法虽没有static标示符,但也可以认为是静态方法。而在构造方法执行(即实例化)时,除了执行静态初始化和域,接着又会执行非静态的初始化和域。
当然非静态在每次实例化都会执行一次。
关于域,那是不归于方法封装的执行代码,即它是可以主动执行(静态在定义时,非静态在实例化时进行)的,而不必通过方法调用,应该有点类似C吧。
4)域中可以定义变量和类,但不能是静态变量和静态类(因为不需要共享),并且变量和类都只是域内部使用,因此不需要public/protected/private标识符。
结论是:
5)静态类首先是内部类,静态类当中可以定义静态元素和非静态元素(包括内部类、变量、方法、域),而非静态内部类只能定义非静态元素。静态类可以直接调用外部类的静态元素,非静态内部类可以直接调用外部类的静态和非静态元素。
6)外部类在执行变量初始化和域(包括静态和非静态)时,不会涉及其内部类的变量初始化和域。相对的,内部类(包括静态类和非静态内部类)在执行自己的变量初始化和域时,也不会执行静态类所属外部类的变量初始化和域。
当然,非静态内部类必须通过其外部类的实例对象来调用,因此会先执行外部类的构造方法,于是该发生的还是会发生。
class M{public static int i=0;public int j=0;static{i++;System.out.println(i);}{ j++; System.out.println(j);}M(){i=i+5; System.out.println(i);
}}public class Staticcls {public static void main(String[]args){System.out.println(M.i+1);//M a=new M();}}
输出结果为1 2,调用方式应该是先分配静态变量i的内存,再执行静态域。在执行main函数。
再将注释语句去掉。则继续执行非静态域,输出j为1 再调用M()构造器 输出i的结构为6.
所以总结是先静态后非静态,静态在没有实例化对象是就分配了内存空间。而非静态是在方法调用是分配内存空间的
- java类的内存分配机制
- java类的内存分配机制
- java的内存分配机制
- java的内存分配机制
- Java的内存分配机制
- java内存分配机制
- java内存分配机制
- java内存分配机制
- java内存分配机制
- java 内存分配机制
- java内存分配机制
- java内存分配机制
- Java的内存分配机制(初步整理)
- java的GC机制--java的内存分配机制
- java中的内存分配机制
- java中的内存分配机制
- java内存分配机制(转)
- java基础:内存分配机制
- aiwi国内最大体感游戏平台 领跑体感游戏第一线
- 定时自动操作数据库——Oracle JOB 用法小结
- cannot set autotrace
- 用javascript实现强制网页全屏
- 大学计算机基础论文的具体内容
- java类的内存分配机制
- php讀取excel
- C# 线程 的研究
- oracle用Authid Current_User 定义的建表过程plsql可执行别的用户对象,但是job却不能调用
- Windows Phone 7的本地存储——IsolatedStorageSettings
- 成功移植linux2.6.38内核到TQ2440(转)
- Calendar 使用注意
- 成功移植linux2.6.38内核到TQ2440(转)
- plsql可执行别的用户对象,过程却不行(AUTHID CURRENT_USER)