Java对象与对象引用变量的理解
Java对象及对象引用
首先定义一个简单的类:
class User{
int userId;
String userName;
}
我们在创建对象时,通常会写:
User user = new User();
这个操作包含了四个动作。
1)右边的"new User",是以User为模板,在堆(heap)中创建一个User类对象(也可以说User对象)。
2)末尾的()意味着,对象创建后,立刻调用User类的构造函数,对刚生成的对象进行初始化。构造函数肯定是有的,如果你没有写,Java会给你补上默认的构造函数。
3)左边"User user"创建了一个User类引用变量。User类引用就是以后可以用来指向User对象的对象引用。
3)"="操作符使对象引用指向刚创建的那个User对象。
为了更好的理解,拆分成两步:
User user;
user = new User();
功能效果是一样的,这样就比较清楚了,有两个实体:一个是对象引用变量,一个是对象本身。
一般引用是存放在栈(stack),对象存放在堆(heap)。
我们创建对象,为什么还要创建对象引用变量?
因为创建的User对象是没有名字的,可以认为是User类名称(对象的创建模板)
所以一个User类可以据此创建无数个对象,且这些对象不能全叫"User"。
我们不能直接访问,只能通过对象引用来间接访问对象。
理解到这里,拓展下这里的知识:
For Example:
User user_1 = new User();
User user_2;
user_2 = user_1;
这里解释下,user_2没有指向对象,但是发生了复制行为,要说的是,对象没有被复制,被复制的只是对象引用。结果是,user_2也指向了user_1所指向的对象。
以此类推:
user_2 = new User();
则表示user_2引用变量修改指向第二个User对象。
得出结论:
1)一个对象引用可以指向一个或多个对象
2)一个对象可以有N个引用指向它
再拓展下:
user_1 = user_2;
现在user_1也指向了第二个User对象,那么第一个User对象呐?因为没有被使用到,就会被Java垃圾回收处理机制回收了,至于什么时候回收,要看垃圾回收机制的策略或者心情了,就是等待JVM回收。
以此类推,一些没有引用指向的对象,都会被丢弃,等待JVM回收
For Example:
new User();
System.out.println("Hello World!");
Java对象与对象引用变量的理解的更多相关文章
- Java对象及对象引用变量
Java对象及其引用 关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对 ...
- JNI-获取Java对象的成员变量-GeInttField()
例: 在Java中定义一个属性,然后用C语言将其设置成另外的值,并输出出来. Java代码: Person.java package com.yuneec.demo; public class Per ...
- Java对象已死吗 深入理解Java虚拟机笔记
1.引用计数器法 给每个对象设置一个计数器,每当有一个引用就给计数器的值+1,引用时小时就减一,当计数器值为0是就可以回收掉了. 主流虚拟机都没有使用这种算法,循环依赖问题 2.可达性分析: 思路是通 ...
- Java 对象及其内存控制
作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 更新:其实这里有好多的变戏法,只要你理解了他们在JVM的中的实现机制,就豁然开朗了.有时间我会把这些变戏法的东西 ...
- Java对象创建过程补遗
一.static修饰的东东是属于这个类的,是所有的该类的实例共享的,因此它们的初始化先于实例对象的初始化. 二.Java中没有静态构造方法,但是有静态代码块.当类中同时存在静态代码块和静态成员变量声明 ...
- Java 访问限制符 在同一包中或在不同包中:使用类创建对象的权限 & 对象访问成员变量与方法的权限 & 继承的权限 & 深入理解protected权限
一.实例成员与类成员 1. 当类的字节码被加载到内存, 类中类变量.类方法即被分配了相应内存空间.入口地址(所有对象共享). 2. 当该类创建对象后,类中实例变量被分配内存(不同对象的实例变量互不相同 ...
- (转)浅谈Java中的对象和对象引用
原文地址: http://www.cnblogs.com/dolphin0520/p/3592498.html 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很 ...
- [转]Java中的对象和对象引用实例浅析
在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别 ...
- 理解Java对象序列化(二)
关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Th ...
随机推荐
- HDU 1102 Kruscal算法
题目大意:给定村庄的数量,和一个矩阵表示每个村庄到对应村庄的距离,矩阵主对角线上均为1 在给定一个数目Q,输入Q行之间已经有通道的a,b 计算还要至少修建多少长度的轨道 这道题目用Kruscal方法进 ...
- [NOIP2003] 提高组 洛谷P1038 神经网络
题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...
- 积累js中的一些问题及解决方案
一.取字符串的第i位不兼容的问题 1.问题:对于字符串str来说,要获取第i位,常见的是str[i],但是在低版本的浏览器中不兼容,例如ie7. 2.解决:使用str.charAt(i); 二.使用定 ...
- Android操作系统架构
Android操作系统架构 Android操作系统整体应用架构 Android系统架构和一些普遍的操作系统差不多,都是采用了分层的架构,从他们之间的架构图看,Android系统架构分为四个层,从高 ...
- 出现 Assigning the return value of new by reference is deprecated in xxxx &&“Warning: Call-time pass-by-reference has been deprecated”怎么办?
自从php5.3,越来越多的人会遇到“Assigning the return value of new by reference is deprecated in xxxx”这样的提示,尤其是在国外 ...
- 压力测试webbench(转)
最近app需要搭建后台,故此研究一下,靠谱的后台服务器..网传nginx 能达到的并发数量比apache 高. LAMP or LNMP ? 根据需求测试结果来进行选择. 首先是安装LNMP测试完后 ...
- 标准格式包含: 私有属性 无参构造 有参构造 setter 和getter 需求中的方法 需求一: 员工类Employee 属性:姓名name,工号id,工资salary 行为:显示所有成员信息的方法show() 需求二: 动物类Animal 属性:姓名name,年龄age 行为:吃饭
// 员工类 public class Employee { private String name; private int id; private double salary; public ...
- java去空格
1.trim()是去掉首尾空格 2.str.replace(" ", ""); 去掉所有空格,包括首尾.中间 3.或者replaceAll(&quo ...
- Arcgis栅格时序地图制作---时间轴动态展示多期影像
转自原文 Arcgis栅格时序地图制作---时间轴动态展示多期影像 效果如何???满意您go on,不满意咱 say goodbye··· 题外话: 为了在这里动态展示下制作结果,也是费了老劲了,转换 ...
- eclipse默认指定项目的编译器版本
eclipse 提示 @Override must override a superclass method 问题解决 今天新换了一个Eclipse 版本: Build id: 20140224-06 ...