从零开始学Java【16】
作者:互联网
从零开始学Java【15】
学习视频:https://www.bilibili.com/video/BV12J41137hu?p=65
目录创建对象内存分析
下面开始对上图的程序进行分析:
- 首先程序对Application进行加载,把Application放到了堆里面的方法区(注:方法区是在堆里面的,是堆中其中一块地方)里面,此时Application有一个main方法,一个常量池,常量池用来存放字符串,比如:“旺财”这个字符串就是存放到里面的。程序开始,main方法被放到栈的里面,且为最底层的栈,这样确保出栈的时候main是最后一个出来的。
- main方法开始执行,第一步程序执行Pet dog = new Pet(),此时程序是没有Pet这个类的,于是程序就在方法区再生成一个Pet类,并且像加载Application那样,开始加入属性name,age还有方法shout,它也有常量池,但是"叫了一声"这个字符串是输出语句,所以是不属于常量池里面的。此时有了Pet类,语句Pet dog = new Pet()就可以正常执行了。
3.执行Pet dog = new Pet(),通过new关键字开始调用构造器,因为是无参构造器然后name和age全都是默认值null和0
- 根据Pet类的模板,生成了dog对象,然后把dog对象放在了栈那里,此时在栈里面的dog只是一个引用变量名,引用的是堆里面真正的对象,在堆这个对象里面存储了地址(假设为0x0001),name,age属性值,以及shout方法,且shout方法调用的是方法区里面的方法。此时,Pet dog = new Pet()这个命令已经走完。
dog.name = "旺财";
dog.age = 3;
dog.shout();
这三个命令已经走完
- 执行dog.name = "旺财",方法区里面的Application常量池里面的旺财,赋值给了堆里面的name,于是堆里面的dog对象更新属性,同理,age也一样,因为shout方法并没有改变什么,所以没改。
- 同理,再创建一个cat对象也是一样的道理。
- 此外,静态方法区就是static关键字的地方,随着类的加载而一起加载,所以堆里面的对象可以随时调用它。
总结
因为静态方法是在方法区里面,随着类的加载而加载,静态对象随之产生;而非静态方法是需要实例化对象才能调用的,所以非静态的对象加载得比静态慢,所以回忆上节的知识点:
非静态可以调用非静态和静态
静态可以调用静态
唯独静态不可以调用非静态
具体原理是:
- 静态对象是和类一起加载的,所以静态化的内容可以不用实例化就进行调用。
- 非静态对象是类实例化之后才存在的。
可以看到,静态的优先级 > 非静态,所以非静态才可以一开始就调用静态了,而调用非静态则需要一定的条件(实例化)。
便可以结合起来理解了。
大总结(类与对象整个章节)
- 类是一个模板,是抽象的,对象是一个具体的实例的。
- 方法的定义和调用。这个需要掌握。
- 对象的引用。可以看到,非静态对象是在栈里面生成的引用变量名,然后这个引用指向堆里面的实际对象。
- 对象的属性,一般叫做成员变量。它一般都是默认初始化,比如null和0之类的。
默认初始化:
数字:0,0.0
char:u0000
boolean:false
引用:null
属性的赋值:修饰符 属性类型 属性名 = 属性值
- 对象的创建和使用
- 必须使用new关键字创建对象,且需要一个构造器。
- 调用对象的属性。如 Pet dog = new Pet(); 再使用 dog.name就可以调用了
- 调用对象的方法 dog.shout();
- 类里面,包含静态的属性和动态的行为,对应的即为属性和方法,类里面只有这两种东西。
标签:调用,Java,16,Pet,dog,静态,从零开始,对象,里面 来源: https://www.cnblogs.com/xiaochaihu/p/16241536.html