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 ...
随机推荐
- 一个python爬虫协程的写法(gevent模块)
from bs4 import BeautifulSoup import requests import gevent from gevent import monkey, pool monkey.p ...
- JS把数字金额转换成中文大写数字的函数
//把数字金额转换成中文大写数字的函数 function num2rmb ($num){ $c1="零壹贰叁肆伍陆柒捌玖"; $c2="分角元拾佰仟万拾佰仟亿" ...
- 虫食算(codevs 1064)
题目描述 Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 + 8468#6 ...
- hihoCoder #1032 : 最长回文子串 [ Manacher算法--O(n)回文子串算法 ]
传送门 #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相 ...
- Linux源代码分析工具-Source Insight
下载地址:http://www.sourceinsight.com/down35.html 可用注冊码:SI3US-205035-36448 使用说明:http://wenku.baidu.com/v ...
- VMware虚拟机上安装linux和克隆
虚拟机上安装好一台linux 系统后.为了高速搭建hadoop集群.须要再安装几个linux系统,比較笨的办法能够又一次用ios 镜像文件进行安装.可是又一次安装须要又一次配置一些信息并且安装时间比較 ...
- vue自定义轮播图组件 swiper
1.banner 组件 components/Banner.vue <!-- 轮播图 组件 --> <template> <div class="swiper- ...
- 用户代码未处理 UpdateException
无法更新 EntitySet"Project_project",由于它有一个 DefiningQuery.而 <ModificationFunctionMapping> ...
- DB 查询分析器 6.03 ,遨游于不论什么Windows操作系统之上的最棒的数据库client工具
DB 查询分析器 6.03 ,遨游于不论什么Windows操作系统之上的最棒的数据库client工具 中国本土程序猿马根峰(CSDN专訪马根峰:海量数据处理与分析大师的中国本土程序猿 .03版本 ...
- 解决UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 12: ordinal not in range(128)的编码问题
当我在运行一个基于scrapy的爬虫时出现UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 12: ordina ...