13.Java面向对象知识大全(下)

简介: 13.Java面向对象知识大全(上)

六、对象内存图

先来复习一下java内存分配:

1.一个对象的内存图

程序从main方法开始执行,首先将TestStudent字节码文件加载到方法区里面,这个时候将main方法进行了临时存储,然后虚拟机会自动调用程序的主入口main方法,main方法会被加载到栈里面,然后执行main方法里面的代码

第一句代码:Student s=new Student();

创建对象(由上图可知需要七步)

(1)加载class文件

在方法区会把Student.class加载到里面临时存储,class里面会有Student的所有信息,比如说所有的成员变量和所有的成员方法,

(2)申明局部变量

其实就是在创建对象时等号左边的代码

在main方法中开创了一块空间,空间名字叫做s,这个空间以后可以存储Student这个类对象的地址值

(3)在堆内存中开辟一个空间

其实就是在创建对象时等号右边的代码

new Student()

由new关键字就是在堆里面开辟了一个空间,而堆里面的空间都是有地址值的.

这个空间的地址值假设是001,这个空间里面会把Student这个类里所有的成员变量拿过来拷贝一份,除此之外,还有所有成员变量存储方法的地址.有地址的原因是以后用对象调用方法的时候,我们能找到对应的方法.此时这个001里面就是我们平时所说的对象

但是这个对象还没有创建完毕,因为name,age还没有值,所以通过4,5,6步骤还要进行赋值

(4)默认初始化

(5)显示初始化

如果在定义成员变量的时候直接给值(下面圈出来的部分),这就叫做显示初始化.没有给出值的时候,可以忽略显示初始化.

(6)构造方法初始化

小括号里面什么都没写,表示调用的是空参构造.空参构造里面什么也没写,所以我们可以忽略构造方法初始化.如果用的是有参初始化构造,此时name和age就有值了.

(7)将堆内存中的地址值赋值给左边的局部变量

此时一个对象创建完毕.

执行过程:

执行完main方法里面的代码之后,main方法出去,main方法里面的变量也消失,变量指向堆内存的对象,由于没有变量去用它(也就是说没有变量指向这个空间了),这个对象也会消失

2.两个对象的内存图

测试类Test2Student字节码文件加载到方法区里面,对main方法进行临时存储,虚拟机调用main方法.

执行main方法里面的代码:

执行第一句的时候参考上面一个对象的内存图的讲解.

在创建第二个对象时,过程如下:

执行完毕之后:

3.两个引用指向同一个对象

执行过程:

重点图:

堆内存中的对象没有人用它的时候,就会消失:

执行完毕之后:main方法出栈

注意:

当两个变量指向同一个空间的时候,只要其中一个变量对这个空间里面的值发生了改变,那么其他的变量再次访问的时候就是改变之后的值.

4.基本数据类型和引用数据类型内存原理

基本数据类型是在变量中存储的是真实的数据值.

引用数据类型记录的是其它空间的地址值.

比如我们在代码中创建的对象,数组;都是引用数据类型.

数组:

总结:

5.this的内存原理图

this的作用:区分局部变量和成员变量

this的本质:所在方法调用者的地址值

案例1:

案例2:

总结:

6.成员变量和局部变量的区别


总结

今天的内容你是否有所收获呢友友们🥰如果有写的不对的地方,欢迎大家帮我指正.最后,希望友友们点赞收藏一下博客关注后续的Java学习内容哦~😘💕💕下篇文章内容是超全的面向对象综合案例哦❤️

相关文章
|
18天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
12 2
|
2月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
2月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
35 4
|
2月前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
1月前
|
存储 Java 程序员
Java基础-面向对象
Java基础-面向对象
16 0
|
2月前
|
安全 Java Go
面向对象程序设计语言:Java
Java语言语法和C语言和C++语言很接近,很容易学习和使用,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的特性,Java语言不使用指针,而是引用,并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧
56 2
|
3月前
|
Java 数据处理 开发者
【Java基础面试十二】、说一说你对面向对象的理解
这篇文章阐述了面向对象是一种以类和对象为基础,通过封装、继承和多态等概念来模拟现实世界中的事物及其相互关系的程序设计方法,它强调以事物为中心进行思考和系统构造,与结构化程序设计相比,更符合人类的自然思维方式。
【Java基础面试十二】、说一说你对面向对象的理解
|
3月前
|
Java
【Java基础面试十三】、面向对象的三大特征是什么?
这篇文章介绍了面向对象程序设计的三大基本特征:封装、继承和多态,其中封装隐藏对象实现细节,继承实现软件复用,多态允许子类对象表现出不同的行为特征。
【Java基础面试十三】、面向对象的三大特征是什么?
|
2月前
|
Java 开发者
Java 面向对象
Java 是一种面向对象的编程语言,通过对象与类的概念组织代码和数据。面向对象编程的核心包括类、对象、继承、多态、封装和抽象。类是对象的蓝图,定义了属性和行为;对象则是类的实例。继承允许子类继承父类的属性和方法,增强代码复用性;多态则支持通过相同接口调用不同类型对象的行为,包括方法重载和重写。封装通过公共方法隐藏对象细节,提高安全性;抽象则对对象特征进行提炼,通过抽象类和接口实现。理解这些概念有助于设计高效、可维护的 Java 应用程序。
|
3月前
|
Java 开发者 C++