Java面向对象和内存分析图文详解

 更新时间:2021年05月31日 12:44:05   作者:兴涛  
这篇文章主要给大家介绍了关于Java面向对象和内存分析的相关资料,文章可以让初学者顺利的分析内存,更加容易的体会程序执行过程中内存的变化,需要的朋友可以参考下

一、Java类

类是面向对象编程中最基本的单位。

Java中的类包含三个内容,分别是:

属性

  • 属性又叫成员变量。
  • 属性用于定义类或类对象的数据(静态特征)。
  • 范围为整个类体。

方法

  • 方法用于定义类或类对象的行为特征(执行动作)(动态)。
  • 方法类似于面向过程中的函数,面向过程中的函数是最基本的单位;
  • 而在面向对象中,最基本单位是类,方法从属于类和对象。

构造方法

  • 构造方法分为无参构造方法;有参构造方法。
  • 构造方法要与类名保持一致。
  • 如果不设置构造方法,则系统自动生成无参构造方法。

属性的定义格式:

 [修饰符] 属性类型 属性名 = [默认值];  //若不初始化则系统默认给默认值

方法定义格式:

[修饰符] 方法返回值类型 方法名(形参){
 语句
}

有如下代码进行示例分析

public class Person{

	public String name;   //属性,带有修饰符
	int age;
	
	public void show(){  //方法
		System.out.println("姓名:"+name+",年龄:"+age);
	}
	
	/*
	Person(){  //构造方法,手动,无参构造方法,一个类里无参构造方法只能有一个
	}
	*/
	
	/*
	Person(String name, int age){   //手动,有参构造方法。
		this.name = name;
		this.age = age;
	}
	*/
	
	public static void main (String[] args){
		Person p1 = new Person("李四",18);  //此时调用的是上面手动有参的构造方法
		Person p2 = new Person();  //此时调用的是无参构造方法
		p2.name = "张三";  //无参构造方法需要以下赋值
		p2.age = 18;
		p2.show();
	} 
}

二、内存分析

上面介绍了类的基本知识,那么我们接下来根据上面的代码来进行内存分析。

JVM内存模型很复杂,为了更好的理解面向对象和面向对象代码,下面进行对模型的简化。(此内存分析并不是为了理解JVM内存模型)

下面对上面三个内存模型进行特征介绍:

栈:

  • 栈描述的是方法执行的内存模型,每个方法被调用时都会创建一个栈帧。
  • JVM为每个线程创建一个栈。
  • 栈是私有,在线程间不会共享。
  • 栈是一段连续的存储空间。

堆:

  • 堆用于存储创建好的对象。
  • JVM只有一个堆。
  • 堆被所有线程共享。
  • 堆是不连续的空间,分配灵活。

方法区:

  • 方法区实际也是堆,用来专门存储类、常量(static关键词相关)等相关信息。
  • JVM只有一个方法区。
  • 可共享。
  • 存储不变的信息。

下面我们来看代码的运行过程:

程序均是将main方法作为程序的入口,执行第二条语句(第一条先忽略)

	Person p2 = new Person();

此时会在栈中开辟一个新的栈帧,为main方法栈帧;方法区会加载整个类模板,存储类里面的相关信息;在堆处会产生一个新的类的对象。如图

/*
小插曲:Java使用new关键字来调用构造方法,从而返回该类的实例(对象)。但是这个对象不是完全由构造方法来创建的。创建一个方法分4步:

在堆中分配对象空间,并将对象的成员变量初始化默认值执行显式初始化(比如int i = 3)执行构造方法返回对象地址

*/

当Person()构造方法调用完成后,出栈继续执行main中的下一条语句。如图

下一条语句是

	p2.name = "张三";
	p2.age = 18;

此时是方法区的张三赋值给name;

我们继续执行下条语句

p2.show();

此时会执行show方法,我们注意到show方法中有age和name。那么它们是谁的name和age呢?我们可以看是p2.show()。p2的地址是0x11,指向的是堆中的0x11对象,所以show方法中的name和age就已知了。

那么当方法执行完后,show方法出栈,同时main方法也执行完毕,也需要出栈,main方法执行完后,对象和方法区中的类信息也就会清空。内存就会回到最初的状态。

总结

到此这篇关于Java面向对象和内存分析的文章就介绍到这了,更多相关Java面向对象内存分析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java Hibernate对象(瞬时态,持久态,脱管态)详解

    Java Hibernate对象(瞬时态,持久态,脱管态)详解

    这篇文章主要介绍了Java Hibernate对象(瞬时态,持久态,脱管态)详解的相关资料,这里对Java Hibernate对象进行了介绍及总结,需要的朋友可以参考下
    2016-11-11
  • 如何在Java中实现一个散列表

    如何在Java中实现一个散列表

    这篇文章主要介绍了如何在Java中实现一个散列表,建一个HashMap,以String类型为Key,Int类型为Value,下文具体的操作过程需要的小伙伴可以参考一下
    2022-04-04
  • Java替换视频背景音乐的实现示例

    Java替换视频背景音乐的实现示例

    FFmpeg 是一个强大的开源多媒体处理工具,被广泛应用于音视频的录制、转码、编辑等方面,本文主要介绍了Java替换视频背景音乐,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • SpringBoot3整合Druid监控功能的项目实践

    SpringBoot3整合Druid监控功能的项目实践

    Druid连接池作为一款强大的数据库连接池,提供了丰富的监控和管理功能,成为很多Java项目的首选,本文主要介绍了SpringBoot3整合Druid监控功能的项目实践,感兴趣的可以了解一下
    2024-01-01
  • 一篇文章带你入门java多线程

    一篇文章带你入门java多线程

    这篇文章主要介绍了java多线程编程实例,分享了几则多线程的实例代码,具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考下
    2021-08-08
  • Spring Boot 各种回滚操作实战教程(自动回滚、手动回滚、部分回滚)

    Spring Boot 各种回滚操作实战教程(自动回滚、手动回滚、部分回滚)

    这篇文章主要介绍了Spring Boot 各种回滚操作实战教程(自动回滚、手动回滚、部分回滚),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • java线程Thread.sleep()对比对象的wait示例解析

    java线程Thread.sleep()对比对象的wait示例解析

    这篇文章主要为大家介绍了java线程Thread.sleep()对比对象的wait示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • SpringBoot2零基础到精通之数据库专项精讲

    SpringBoot2零基础到精通之数据库专项精讲

    SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架,本篇我们来学习如何连接数据库进行操作
    2022-03-03
  • Java结合EasyExcel构建复杂多级表头

    Java结合EasyExcel构建复杂多级表头

    在Java开发中,处理Excel文件时,构建复杂的多级表头是一项常见且具有挑战性的任务,下面小编就来和大家聊聊如何通过自定义方法实现多级表头的构建吧
    2025-03-03
  • Spring boot集成Kafka消息中间件代码实例

    Spring boot集成Kafka消息中间件代码实例

    这篇文章主要介绍了Spring boot集成Kafka消息中间件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05

最新评论