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面向对象内存分析内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 全方位讲解Java的面向对象编程思想

    什么是面向对象? Object 对象,Oriendted 以-为导向的, Programming 程序设计 面向对象就是使用对象进行程序设计,简写成OOP. SP和OOP对比 面向对象的三大原则      封装  继承   多态 对象 对象是面向对象编程的核心部分,是实际存在的具体实体,具有明确定义的状态和行为: 对象其实就是"数据"和"函数"的封装体,其中: 数据表示自身的状态,也称作"属性"或"成员数据": 函数表示自身的

  • 详解Java 中程序内存的分析

    这篇文章将简单的说明下当我们运行Java程序时JVM(Java虚拟机)的内存分配情况. 首先我们先来感观的认识下几个名词: 1.栈,一般来说,基本数据类型直接在栈中分配空间,局部变量(在方法代码段中定义的变量)也在栈中直接分配空间,当局部变量所在方法执行完成之后该空间便立刻被JVM回收,还有一种是引用数据类型,即我们通常所说的需要用关键字new创建出来的对象所对应的引用也是在栈空间中,此时,JVM在栈空间中给对象引用分配了一个地址空间(相当于一个门牌号,通过这个门牌号就可以找到你家),在堆空间中

  • 深入java内存查看与分析详解

    1:gc日志输出在jvm启动参数中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplicationStopedTime,jvm将会按照这些参数顺序输出gc概要信息,详细信息,gc时间信息,gc造成的应用暂停时间.如果在刚才的参数后面加入参数 -Xloggc:文件路径,gc信息将会输出到指定的文件中.其他参数还有-verbose:gc和-XX:+PrintTenuringDistribution等.

  • 深入分析Java内存区域的使用详解

    Java 内存划分: 在Java内存分配中,java将内存分为:方法区,堆,虚拟机栈,本地方法栈,程序计数器.其中方法区和堆对于所有线程共享,而虚拟机栈和本地方法栈还有程序计数器对于线程隔离的.每个区域都有各自的创建和销毁时间. 程序计数器:     作用是当前线程所执行的字节吗的行号指示器.Java的多线程是通过线程轮流切换并分配处理器执行时间方式来实现的.因此,每个线程为了能在切换后能恢复到正确的位置,每个线程需要独立的程序计数器. Java 虚拟机栈: 每个放在被执行的时候都会同时创建一个

  • Java中面向对象的知识点总结

    一.对象和类的概念 类:对具有相同属性和方法的一类事物的抽象. 对象:具体的某一事物,代表自身的一些属性和方法. 二.类(对象)之间的关系 关联(组合.聚合),继承,依赖.实现 三.面向对象设计思想 面向对象--->考虑哪些类,对象--->类和对象有属性.方法----->类和类之间的关系 四.重载.重写和隐藏 1). 重载(overload): 方法重载就是多个方法名称相同但是参数类型或者参数个数不同的方法,与返回值类型和修饰符无关 class Test { public int tes

  • java实现学生管理系统(面向对象)

    本文实例为大家分享了java实现学生管理系统的具体代码,供大家参考,具体内容如下 import java.util.Iterator; import java.util.Scanner; import java.util.Set; import java.util.TreeSet; /** * 学生管理系统 * 1.添加学生(不可以重复添加,学生的学号决定是否为同一个学生,学生按照学号进行排序) * 2.可以查看学生信息(包括,学号,姓名,性别,联系电话,年龄) * a.查看所有学生信息 * b

  • Java基础教程之Hello World到面向对象

    Java是完全面向对象的语言.Java通过虚拟机的运行机制,实现"跨平台"的理念.我在这里想要呈现一个适合初学者的教程,希望对大家有用. "Hello World!" 先来看一个HelloWorld.java程序.这个程序在屏幕上打印出一串字符"Hello World!": 复制代码 代码如下: public class HelloWorld {     public static void main(String[] args)     {  

  • Java面向对象编程(封装/继承/多态)实例解析

    本文主要介绍了面向对象的三大特征实例解析,下面看看具体内容. 封装 封装一个Teacher和Student类 package com.hz.test; public class Teacher { private String name; private String majorDirection; private String teachCourse; private int teachAge; public Teacher() { super(); } public Teacher(Stri

  • Java面向对象的三大特征

    java面向对象的三大特征:"封装.继承.多态".更多Java技术知识,请登陆疯狂软件教育官网.微信搜索微信号:疯狂软件,参加2015年优惠活动,有机会获得优惠劵和代金劵. 以本文为例,User类中的变量为私有变量,只能通过创建对象(此时构造方法自动调用)来赋值. 外界只能通过公有方法api()来访问User类. Admin类继承了User类,调用了其构造方法,还重写了method_1方法,增加了一个特有方法power(). User文件 public class User { /**

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

    一.Java类 类是面向对象编程中最基本的单位. Java中的类包含三个内容,分别是: 属性 属性又叫成员变量. 属性用于定义类或类对象的数据(静态特征). 范围为整个类体. 方法 方法用于定义类或类对象的行为特征(执行动作)(动态). 方法类似于面向过程中的函数,面向过程中的函数是最基本的单位: 而在面向对象中,最基本单位是类,方法从属于类和对象. 构造方法 构造方法分为无参构造方法:有参构造方法. 构造方法要与类名保持一致. 如果不设置构造方法,则系统自动生成无参构造方法. 属性的定义格式:

  • 使用Spring Boot搭建Java web项目及开发过程图文详解

    一.Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者.SpringMVC是非常伟大的框架,开源,发展迅速.优秀的设计必然会划分.解耦.所以,spring有很多子项目,比如core.context.

  • Java面向对象类和对象实例详解

    目录 1 - Java面向对象学习的三条主线 2 - 面向过程与面向对象 3 - 面向对象的三大特征 4 - 面向对象分析方法分析问题的思路和步骤 5 - 面向对象的思想概述 6 - 类和对象的创建-内存解析 7 - 类中属性的声明和使用(局部变量与成员变量的区别) 8 - 类中方法的声明和使用 9 - 对象数组的使用 10 - 理解 "万物皆对象" 11 - 匿名对象 12 - 方法的封装(数组常用算法的封装) 总结 1 - Java面向对象学习的三条主线 ①Java类即类的成员:属

  • Java面向对象编程之类的继承详解

    本文实例讲述了Java面向对象编程之类的继承.分享给大家供大家参考,具体如下: 继承:特殊类拥有一般类的全部属性与行为. 继承好处: 1.提高了代码的复用性 2.让类与类之前产生了关系,有了这个关系才有多态的特性.继承是类和类之前的关系. 注意事项: 1.java只支持单继承,不支持多继承.因为多继承有安全隐患:当多个父类定义相同的函数,但是功能不同时,子类不知道运行哪一个. 2.子类继承父类时,继承了父类的所有方法和属性,可直接使用. 3,java支持多层继承,即:孙-子-父的关系 语法: [

  • java基础二叉搜索树图文详解

    目录 概念 直接实践 准备工作:定义一个树节点的类,和二叉搜索树的类. 搜索二叉树的查找功能 搜索二叉树的插入操作 搜索二叉树删除节点的操作-难点 性能分析 总程序-模拟实现二叉搜索树 和java类集的关系 总结 概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:1.若它的左子树不为空,则左子树上所有节点的值都小于根结点的值.2.若它的右子树不为空,则右子树上所有节点的值都大于根结点的值.3.它的左右子树也分别为二叉搜索树 直接实践 准备工作:定义一个树节点的类,和二

  • C语言中动态内存管理图文详解

    目录 1.动态内存开辟的原因 2.动态内存函数的介绍 2.1malloc和free 2.2calloc 2.3realloc 3.常见的动态内存错误 3.1对NULL指针的解引用操作 3.2对动态开辟空间的越界访问 3.3对非动态开辟内存使用free 3.4使用释放一块动态开辟内存的一部分 3.5对同一块动态内存多次释放 3.6动态开辟内存忘记释放(内存泄漏) 4.练习 4.1练习1 4.1练习2 4.3练习3 4.4练习4 5.C/C++程序的内存开辟 总结 1.动态内存开辟的原因 常见的内存

  • C/C++指针与内存管理图文详解

    目录 一.指针 二.数组 总结 指针和内存管理始终是C/C++比较容易模糊的知识点,但在C/C++编程中又绕不开的地方,特别在下位机上,会频繁的与指针打交道,如果概念模糊,一不小心就会写出冗余的代码,可能会引起多余内存开销或者直接影响运行速度. 一.指针 1.计算机内存主要分成这几个区,每个区又分成无数个字节(Byte),每个字节(Byte)都有唯一的编号,而这个编号就这个字节的指针地址.一般程序能读写的区域只有全局变量.堆区.栈区.下面是计算机内存的示意图: 每个字节(Byte)对应的编号地址

  • Java LinkedList的实现原理图文详解

    一.概述 先来看看源码中的这一段注释,我们先尝试从中提取一些信息: Doubly-linked list implementation of the List and Deque interfaces. Implements all optional list operations, and permits all elements (including null).All of the operations perform as could be expected for a doubly-l

  • 图文详解Java的反射机制

    目录 1.什么是反射 2.Hello,java反射 3.java程序运行的三个阶段 4.反射相关类 5.反射的优化 6.Class类分析 7.获取Class对象的六种方式 8.类加载机制 动态加载和静态加载 类加载流程概述 加载阶段 连接阶段 初始化 9.通过反射获取类的结构信息 1.什么是反射 反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息. 加载类后,在堆中就产生了一个class类型的对象,这个对象包含了类的完整结构的信息,通过这个对象得到类的结构.这

  • Java GC 机制与内存分配策略详解

    Java GC 机制与内存分配策略详解 收集算法是内存回收的方法论,垃圾收集器是内存回收的具体实现 自动内存管理解决的是:给对象分配内存 以及 回收分配给对象的内存 为什么我们要了解学习 GC 与内存分配呢? 在 JVM 自动内存管理机制的帮助下,不再需要为每一个new操作写配对的delete/free代码.但出现内存泄漏和溢出的问题时,如果不了解虚拟机是怎样使用内存的,那么排查错误将是一项非常艰难的工作. GC(垃圾收集器)在对堆进行回收前,会先确定哪些对象"存活",哪些已经&quo

随机推荐