类的定义和加载

类一旦加载,就会占用内存(否则加载啥),实例化,是将其在堆里面复制了一份(一般是属性),然后返回给用户。根据不同的需求实例化成不同的实例,这就是多态。所以类只是对象的模板。类在实例化之前肯定储存在代码段中只是没有执行而已(或许放这些定义放在静态区更合适,这样既不影响cs:ip寄存器按照顺序执行指令,需要执行方法和类的时候,只需要将数据段的dx寄存器地址给cs,偏移量给ip就可以了,返回的时候再把cs:ip更新回来继续执行下面的指令),就像function一样,这个段在new的时候才能执行并为类中的成员属性在堆中分配空间,方法在堆中只有指针,指针指向代码段的方法定义,就像function只有在调用的时候才会在栈中为它定义的临时变量分配空间。类只是一种定义,和function一样,但是类变量(静态变量)和类方法(静态方法)不同,他们在类加载时候就执行了并且和常量一起被分布到静态区了,所以可以直接访问,不过他们还是属于类的,所以访问前要加上类名和范围解析符。类中的普通方法和普通属性在实例化之前变量名不会存储在符号表中,实例化后对象指针存在栈中的变量,类中的属性名在符号表中对应的是是对象地址的偏移量,而代码段类中的普通方法的地址被存在对象中的方法指针中。(从汇编的角度看,方法和类是一样的,都是放在将控制权返回cmd之后的代码,返回cmd之前是真正需要执行的代码,执行代码中遇到调用函数的话就跳到函数地址,他们都有直接定址表来运算出地址,在代码中的体现是他们的函数名和对象名,执行完再回来,类也是如此。)

先通俗的分析下,我们把类看作是一个房子。房子里面有家具,桌椅板凳之类的,房子里面还有人。
房子里面所有的人都应该是共有一套家具的。也就是说,这些家具是唯一的,如果某个家具坏了,那么大家都用不了。
我们再看一看定义,java的静态变量也叫做类变量,它开始于类的创建,结束于类的消亡。非静态变量叫做实例变量,它开始于类的实例的创建,结束语类的实例的消亡。静态变量被所有实例所共享。也就是如上面的例子,座椅板凳是类变量,它们是在房子被建好了之后就被添加放置进来,而且基本都是唯一的。人就相当于实例,每个人都能用这些家具,但是如果家具一旦损坏,那就是坏了,或者你把某一个家具搬走,那么所有的人都用不了这个家具,房子里也不存在这个家具了。
但是房子里可以进很多人,可以进张三,也可以进李四。所以这些人就是类的实例对象,他们身上穿的衣服就可以叫做实例变量。
那么在内存之中又是如何的呢?当一个类被创建并初始化后,内存中会有两个区域,栈区和堆区。栈中主要存放的是引用变量,堆中主要存放的是真实的被实例化后的类。栈中的引用变量会指向堆中的真实对象地址。比如A a=new A(); a这个变量就会在栈中,实际被new出来的类A的对象会放在堆中,a指向实际被new出来的A对象。
如果一个类中有静态变量的话,程序首先会把该静态变量加载进内存中,也就是在堆中开辟一个区域专门存放。以后不管你new多少个类的对象,该静态变量永远都是在那里的。也就是说,静态变量在类的初始化一次后,系统就不会为该变量开辟新的内存空间。而每new一个类的对象,系统就会重新在
堆内存中开辟一个新空间来存放该类的实例对象,并且栈中也会有一个新的引用变量去指向它。
静态方法也是类似,但是有一点要强调,静态方法只中不能调用非静态方法。因为被static修饰的方法会首先被Classloader对象先加载进内存,而这个时候可能其它的非静态方法或者变量还没有被加载进来。就好比我现在想做包子,现在面粉被static修饰,首先已经拿到你身边,可是因为包子馅不是static修饰的,所以可能包子馅儿还没运过来,你说怎么做的出包子呢。
被static修饰过的都是随着类的初始化后就产生了,在堆内存中都有一块专门的区域来存放,所以只需要类名点方法名或者变量名即可。而非静态的就必须通过类的对象去调相应的。就像是你想要红色的衣服,你必须是从穿红色的衣服的人的身上拿过来才行,所以你必须找到穿红色衣服的人,也就是类的实例对象,而你如果要去找一个桌子,而桌子就在房间里摆着,你只要进到房间里直接走过去拿来就可以了~~

版权声明:本文为CSDN博主「BetaCat1」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/DDD_QQQ/article/details/99333472

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值