一个程序员(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 如有问题可联系本人,一个程序员;
废话不多说,直接上代码
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 如有问题可联系本人,一个程序员;
相关文章推荐
- 一个程序员(Java工程师日记第三刊 继承初始化)
- 一个程序员(Java工程师日记第二刊 使用接口注意事项)
- C++程序员如何向一个java工程师解释extern "C"的作用
- C++程序员如何向一个java工程师解释extern "C"的作用
- 好程序员:一个Java高级工程师的必备技能
- C++程序员如何向一个java工程师解释何为reference引用?
- C++程序员如何向一个java工程师解释何为reference引用?
- 好程序员:一个Java高级工程师的必备技能
- Java高级工程师面试经验,一个草根程序员是如何进入BAT的。
- 一个JAVA程序员经常访问的网站
- java程序员菜鸟进阶(八)分享一个爬取B2B网站信息的程序
- 一个优秀的Java程序员必须了解的GC机制
- 一个Java程序员的Ruby on Rails体验(转)
- .NET还是JAVA,一个中国程序员的评论
- 一个Java程序员应该掌握的10项技能
- 一个Java程序员应该掌握的10项技能
- 一个Java程序员应该掌握的10项技能
- 一个程序员超牛的JAVA独立毕业设计截图[附源码+jar包]
- 张奇老师的《一个Java程序员应该掌握的10项技能 》
- 不会用ant打包、部署项目的工程师,不是一个好程序员(测试)