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

很多初学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不可以被继承,但可以创建实例
   

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

syenging@163.com 如有问题可联系本人,一个程序员;




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值