Java中对象、对象引用、堆、栈、值传递以及引用传递的详解
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中对象、对象引用、堆、栈、值传递以及引用传递的详解的更多相关文章
- Java堆/栈/常量池以及String的详细详解(转)------经典易懂系统
一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...
- java中String、包装类、枚举类的引用传递
一般情况下,我们认为Java中了除了八种基本数据类型,其他都是对象,进行引用传递: 但是:String.包装类.枚举类作为参数传递后发现,没有达到引用传递的效果,很多人认为它是值传递! 首先,对象肯定 ...
- 详解Java中对象的软、弱和虚引用的区别
对于大部分的对象而言,程序里会有一个引用变量来引用该对象,这是最常见的引用方法.除此之外,java.lang.ref包下还提供了3个类:SoftReference.WeakReference和Phan ...
- Java中的IO、NIO、File、BIO、AIO详解
java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包 ...
- Java中的锁原理、锁优化、CAS、AQS详解!
阅读本文大概需要 2.8 分钟. 来源:jianshu.com/p/e674ee68fd3f 一.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 二.锁实现的基本原理 2.1.v ...
- Java 中的锁原理、锁优化、CAS、AQS 详解!
来源:jianshu.com/p/e674ee68fd3f 1.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 2.锁实现的基本原理 2.1.volatile Java编程语言允 ...
- Java 中的锁原理、锁优化、CAS、AQS 详解!(转)
1.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 2.锁实现的基本原理 2.1.volatile Java编程语言允许线程访问共享变量, 为了确保共享变量能被准确和一致地更新, ...
- JAVA的对象和封装及static与final的用法(详解)
一:软件出现的目的 1:用计算机的语言描述现实世界 2:用计算机解决现实世界的问题 编程思维: 使用面向对象的思想(描述)面向对象的世界 (符合人类的思维习惯) 二:面向对象设计和开发程序的 ...
- java中调用本地动态链接库(*.DLL)的两种方式详解和not found library、打包成jar,war包dll无法加载等等问题解决办法
我们经常会遇到需要java调用c++的案例,这里就java调用DLL本地动态链接库两种方式,和加载过程中遇到的问题进行详细介绍 1.通过System.loadLibrary("dll名称,不 ...
随机推荐
- 在数组中寻找出现次数大于N/K的数
给定一个int[]数组,给定一个整数k,打印所有出现次数大于N/k的数,没有的话,给出提示信息. === 核心思想:一次在数组中删除K个不同的数,不停的删除,直到剩下的数的种类不足K就停止删除,那么如 ...
- arp_ignore和arp_announce内核参数
arp_announce : INTEGER 对网络接口上本地IP地址发出的ARP报文作出相应级别的限制. 0:本机所有IP地址都向任何一个接口通告ARP报文. 1:尽量仅向该网卡回应与该网段匹配的A ...
- POJ2749 Building roads 【2-sat】
题目 Farmer John's farm has N barns, and there are some cows that live in each barn. The cows like to ...
- Linux系统——访问U-BOOT环境变量
Linux系统下访问U-BOOT环境变量 移植过U-BOOT的人,都知道:在U-BOOT中存有ENV.但U-BOOT在引导内核启动之后,U-BOOT的生命周期就结束了.那么启动LINUX内核之后,U- ...
- 无序字母对 character
无序字母对 character 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入 ...
- 出租车(taxi)
出租车(taxi) 题目描述 Bessie在农场上为其他奶牛提供出租车服务.这些奶牛已经在沿着长度为M(1<= M <= 1,000,000,000)的栅栏上不同的地点聚集等候.不幸的是, ...
- 【CCF】除法 树状数组
[AC] #include<iostream> #include<math.h> #include<cstring> using namespace std; ty ...
- 【winform】基于UserControl实现webBrower组件时html页面元素加载及onclick事件监听实现
[背景]基于System.Windows.Forms.UserControl实现的webBrower组件在html内使用window.external调用winform事件失败. [解决思路]借助wi ...
- spring整合jedis时所遇问题
@Test public void testSpringJedisPool(){ ApplicationContext ac = new ClassPathXmlApplicationContext( ...
- poj 3169&hdu3592(差分约束)
Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9687 Accepted: 4647 Descriptio ...