Java中对象、对象引用、堆、栈、值传递以及引用传递的详解

1.对象和对象引用的差别:

(1).对象:

万物皆对象。对象是类的实例。

在Java中new是用来在堆上创建对象用的。

一个对象能够被多个引用所指向。

(2).对象引用:

相似于C++中的地址。通过对象引用能够找到对象。

一个引用能够指向多个对象。操纵的标识符实际上是指向对象的引用。

就像:对象存放在屋子里,对象的引用就相当于屋子的钥匙。

2.值传递和引用传递的差别:

(1).值传递:传递的是值的拷贝。

也就是说传递后就不互相关了。

(2).引用传递:传递的是值的引用。

是内存空间的地址。

也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。

3.堆和栈的差别:

(1).栈:在函数中定义的一些基本类型的变量。和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间。当超过变量的作用域后。Java会自己主动释放掉为该变量所分配的内存空间。

该内存空间能够马上被另作他用。

引用变量就相当于是为数组或对象起的一个名称。以后就能够在程序中使用栈中的引用变量来訪问堆中的数组或对象。

(2).堆:堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自己主动垃圾回收器来管理。

(3).生命周期:

A.引用变量的生命周期:程序执行一直到变量的作用域之外就被释放

B.数组和对象的生命周期:程序执行到使用new产生数组或者对象的语句所在的代码块之外,数组和对象本身占领的内存不会被释放。数组和对象在没有引用变量指向它的时候,才变为垃圾,不能再被使用。

但仍然占领内存空间不放,在随后的一个不确定的时间被垃圾回收器收走。

这也是Java比較占内存的原因,实际上栈中的变量指向堆内存中的变量,这就是Java中的指针。

4.Java中的内存机制:

Java把内存分为两种:一种是栈内存。

一种是堆内存。



栈内存:在函数中定义的一些基本类型的变量和对象的引用变量。

堆内存:由new创建的对象和数组。在堆中产生了一个数组或者对象之后,还能够在栈中定义一个特殊的变量。让栈中的这个变量的取值等于数组或对象在堆内存中的首地址。

栈中的这个变量就成了数组或对象的引用变量。以后就能够在程序中使用栈中的引用变量来訪问堆中的数组或者对象,引用变量就相当于是为数组或对象起的一个名称。引用变量是普通的变量,定义时在栈中分配。

Java中对象、对象引用、堆、栈、值传递以及引用传递的详解的更多相关文章

  1. Java堆/栈/常量池以及String的详细详解(转)------经典易懂系统

    一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...

  2. java中String、包装类、枚举类的引用传递

    一般情况下,我们认为Java中了除了八种基本数据类型,其他都是对象,进行引用传递: 但是:String.包装类.枚举类作为参数传递后发现,没有达到引用传递的效果,很多人认为它是值传递! 首先,对象肯定 ...

  3. 详解Java中对象的软、弱和虚引用的区别

    对于大部分的对象而言,程序里会有一个引用变量来引用该对象,这是最常见的引用方法.除此之外,java.lang.ref包下还提供了3个类:SoftReference.WeakReference和Phan ...

  4. Java中的IO、NIO、File、BIO、AIO详解

    java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?         Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包 ...

  5. Java中的锁原理、锁优化、CAS、AQS详解!

    阅读本文大概需要 2.8 分钟. 来源:jianshu.com/p/e674ee68fd3f 一.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 二.锁实现的基本原理 2.1.v ...

  6. Java 中的锁原理、锁优化、CAS、AQS 详解!

    来源:jianshu.com/p/e674ee68fd3f 1.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 2.锁实现的基本原理 2.1.volatile Java编程语言允 ...

  7. Java 中的锁原理、锁优化、CAS、AQS 详解!(转)

    1.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 2.锁实现的基本原理 2.1.volatile Java编程语言允许线程访问共享变量, 为了确保共享变量能被准确和一致地更新, ...

  8. JAVA的对象和封装及static与final的用法(详解)

    一:软件出现的目的 1:用计算机的语言描述现实世界 2:用计算机解决现实世界的问题 编程思维:  使用面向对象的思想(描述)面向对象的世界     (符合人类的思维习惯) 二:面向对象设计和开发程序的 ...

  9. java中调用本地动态链接库(*.DLL)的两种方式详解和not found library、打包成jar,war包dll无法加载等等问题解决办法

    我们经常会遇到需要java调用c++的案例,这里就java调用DLL本地动态链接库两种方式,和加载过程中遇到的问题进行详细介绍 1.通过System.loadLibrary("dll名称,不 ...

随机推荐

  1. leetcode NO.349 两个数组的交集 (python实现)

    来源 https://leetcode-cn.com/problems/intersection-of-two-arrays/ 题目描述 给定两个数组,写一个函数来计算它们的交集. 例子: 给定 nu ...

  2. 【bzoj3884】上帝与集合的正确用法 扩展欧拉定理

    题目描述 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“元”构成的集合.容 ...

  3. 【BZOJ1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 (二分+SA)

    求重复k次的最长重复子串,解法见罗穗骞大神的后缀数组论文 ; var x,y,rank,sa,h,s,num,c:..maxn] of longint; n,time:longint; functio ...

  4. 游戏(game)

    游戏(game) 题目描述 这个游戏是这样的,你有一个初始序列S ,你每次可以选择一段任意长度的连续区间,把他们+1 再膜k,给定目标序列,你需要尝试用尽量少的操作次数将初始序列变为目标序列.作为一名 ...

  5. wooyun

    转自:http://zone.wooyun.org/content/19128 tencent.com baidu.com sina.com.cn sohu.com discuz.net rising ...

  6. error: ‘to_string’ was not declared in this scope

    错误: error: ‘to_string’ was not declared in this scope 原因: to_string是C++11引入的新功能,旧版本编译器可能不支持它,所以要给编译器 ...

  7. 问题:viewController不会调用dealloc()不会销毁

    问题 在调试程序时,我从ViewController A push进 ViewController B,在从B back时发现程序不会执行B里面的dealloc(),很诡异的问题,因为按理说此时点击b ...

  8. 【HDOJ5534】Partial Tree(树,背包DP)

    题意:有一棵n个点的形态不定的树,每个度为i的节点会使树的权值增加f[i],求树的最大权值 n<=2015,0<=f[i]<=1e4 思路:对不起队友,我再强一点就能赛中出这题了 显 ...

  9. 通过命令编译的项目 导入 到eclipse

    通过命令编译的项目 导入 到eclipse后,需要 1.设置 sdk和ndk 的路径 2.设置 AndroidManifest.xml 中的版本为当前版本:<uses-sdk android:m ...

  10. android中Adapter适配器的讲解

    Adapter(适配器的讲解) 适配器就我自己来看,我觉得这是一个非常重要的知识点,Adapter是用来帮助填出数据的中间桥梁,简单点说吧:将各种数据以合适的形式显示在View中给用户看.Adapte ...