您的位置:首页 > 职场人生

一个程序员(Java工程师日记第一刊)

2015-03-23 22:00 369 查看
很多初学Java的人对Java虚拟机的内存分配机制心里没一个谱,在我看来,不知道背后原理的机制,就如同一个人没有灵魂的行走,而一个人没有灵魂,那么则是死亡-------前言

废话不多说,直接上代码

Student s = new Student();

(1)把Student.class文件加载到内存

(2)在栈内存为s开辟空间

(3)在堆内存为学生对象申请空间

(4)给学生的成员变量进行默认初始化。

(5)给学生的成员变量进行显示初始化。

(6)通过构造方法给成员变量进行初始化。

(7)对象构造完毕,把地址赋值给s变量

以上程序在内存机制当中走了这样一道流程, 这是一个很简单的类分层初始化问题.我之前也搞不清楚堆内存是何时分配,而栈内存是何时弹栈,方法区存放什么东西,但还是要多动手去画内存图,这对没有任何编程基础的人兴许会是一种折磨,但你只要坚持,你就会发现其实也没那么难,任何一门语言都一样,内存区域都差不多,只要掌握了原理,就不必担心。

以下上传了一张静态变量在内存中的分解图

加了static之后就是共有属性,没加之前就是特有属性,而是在某个区域里面共存一份,静态是随着类的加载而加载,而对象是随着new而存在的,优先于对象存在,它是随着字节码文件进内存的,且被类的所有对象共享,作为静态成员变量跟成员方法可以通过类名调用,而作为非静态成员只能通过对象调用。

静态修饰的内容与类相关,而非静态修饰的它所属于对象的,使用静态需要记住:共性用静态,特性用非静态,静态修饰的变量随着字节码文件的载入内存而存在,被所有对象所共享,共享区域(静态修饰)相当于解压缩文件的,我可以通过类名.调用这个属性,且被所有对象所共享,而非共享区域相当于未执行的方法(压缩文件),如果要是使用则必须要通过对象名.去调用此方法(压缩文件),且在栈内存开辟空间,非静态的成员方法可以访问静态的成员,因为静态加载的时机比非静态的成员方法更早,故此可以调用

静态优先于对象存在,静态方法不能访问非静态的成员,因为非静态成员所属于对象,这也是因为加载时机,当加载静态方法的时候,非静态方法还未加载到内存区,故此静态方法调用非静态成员变量会出现无法引用的错误,静态方法中不能使用this,因为this表示是当前对象的引用,而静态可以用类名.去调用,故此静态只能访问静态(静态优先于this而存在)这里也存在了加载时机。


当一个类中所有的方法都是静态的时候,需要多做一步,将构造函数私有,目的是不让其它类创建本类对象,

当构造方法别声明为private时,就意味着只有当前类的方法可以调用它,

一:当前类的其它构造方法可以通过this关键字来调用。

二:当前类的成员方法可以通过new语句调用它。

把构造方法声明为private的理由:


1.这个类中仅仅包含供其它类调用的静态方法,没有实例方法,这意味着当某个类想要调用该类的方法时,无需创建该类的实例,既不会触及该类的构造方法

2.禁止这个类被继承

3.这个类需要把自身实现的细节封装起来,不允许其他程序通过new语句来创建这个类的实例,这个类向其他程序提供了获取自身实例的静态方法,这种方法称之为静态工厂方法

用abstract修饰词修饰的类也不可以创建实例,跟private访问权限词限定构造访问的区别在于abstract可以被继承,不能创建实例

final修饰词修饰的类也不能被继承,在此和private访问权限词限定构造的区别在于final不可以被继承,但可以创建实例


有些代码不应该被忘记,也没有源代码不应该被记住。

arrayslength@126.com 如有问题可联系本人,一个程序员;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: