Java中对象和对象引用的区别,引用、指向是什么意思
Java的变量分为两大类:基本数据类型和引用数据类型。
其中基本类型变量有四类8种:byte short int long float double char boolean,除了8种基本数据类型变量,其他变量都是引用数据类型,如类、接口、数组等。
基本数据类型,只有一块存储空间, 在栈中,存放的是具体数据值。
引用数据类型,有两块存储空间一个在栈(Stack)中,一个在堆(heap)中。堆中存放对象实体(使用new关键字,即表示在堆中开辟一块新的存储空间),栈中存放对象在堆中所在位置的首地址。引用类型变量类似于C/C++中的指针。
引用:一个引用类型变量(栈中的一块内存空间)保存了一个该类型对象在堆中所在位置的首地址,也称作一个引用类型变量指向了一个该类型的对象,通过这个变量就可以操作对象中的数据。
看下面一段代码:
class Person {
String name;
int age;
}
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "张伟";
p1.age = 17;
System.out.println("姓名:" + p1.name + ",年龄:" + p1.age);
Person p2 = new Person();
p2.name = "李丽";
p2.age = 12;
System.out.println("姓名:" + p2.name + ",年龄:" + p2.age);
p1 = p2;
p1.age = 13;
System.out.println("姓名:" + p1.name + ",年龄:" + p1.age); //姓名:李丽,年龄:13
System.out.println("姓名:" + p2.name + ",年龄:" + p2.age); //姓名:李丽,年龄:13
}
}
Person类对象的内存图:
多个对象在堆内存中,都有不同的内存划分
当多个对象的引用指向堆同一块内存空间(p1 = p2; 即将一个对象的引用赋值给另一个变量,两个变量所记录的地址值是一样的,此时p1指向 p2所指向的对象,不再指向 p1原本指向的对象,如上图所示),只要通过任何一个对象引用修改了对象中的数据,随后,无论使用哪一个对象引用获取数据,得到的都是修改后的值,因此,最后两行打印语句的结果是一样的。
所以,对于引用数据类型,如 Person p = new Person(); 将 p 简单理解为对象名是不合适的。
Java中对象和对象引用的区别,引用、指向是什么意思的更多相关文章
- java中对象和对象引用的区别
1.何谓对象? 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一 ...
- Java中对象、对象引用、堆、栈、值传递以及引用传递的详解
Java中对象.对象引用.堆.栈.值传递以及引用传递的详解 1.对象和对象引用的差别: (1).对象: 万物皆对象.对象是类的实例. 在Java中new是用来在堆上创建对象用的. 一个对象能够被多个引 ...
- Java中对象和引用的理解
偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两方面去更形象的认识理解,再去记忆. 一.对象和引用的概念: 在Java中万 ...
- Java中堆和栈的区别(转)
栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...
- java中堆和堆栈的区别
java中堆和堆栈的区别(一) 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取 ...
- Java中Set Map List 的区别
java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...
- Java中this与super的区别【6】
若有不正之处,请多多谅解并欢迎批评指正,不甚感激.请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing/ ...
- 【Java面试题系列】:Java中final finally finalize的区别
本篇为[Java面试题系列]第三篇,文中如有错误,欢迎指正. 第一篇链接:[Java面试题系列]:Java基础知识常见面试题汇总 第一篇 第二篇链接:[Java面试题系列]:Java基础知识常见面试题 ...
- Java中final,finally和finalize区别
Day11_SHJavaTraing_4-18-2017 Java中final,finally和finalize区别 1.final—修饰符(关键字) ①final修饰类,表示该类不可被继承 ②fin ...
随机推荐
- 遍历map的6种方式
1,平时开发中对map的使用很多,然后发现了很多map可能存在的各种问题:如HashMap 需要放置 1024 个元素,由于没有设置容量初始大小,随着元素不断增加,容量 7 次被迫扩大,resize ...
- Python爬虫入门有哪些基础知识点
1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.想抓取什么?这个由你来控制它咯. ...
- 疑难杂症1-去掉网站里的特殊编码
编辑器:Visual Studio 2019项目框架:Net Core 3.1 + AutoFac 特殊符号,这是编码UTF-8 + BOM的特殊标记,是隐藏的,但是会被浏览器翻 ...
- Spring Boot使用AOP的正确姿势
一.为什么需要面向切面编程? 面向对象编程(OOP)的好处是显而易见的,缺点也同样明显.当需要为多个不具有继承关系的对象添加一个公共的方法的时候,例如日志记录.性能监控等,如果采用面向对象编程的方法, ...
- 离线安装paramiko
1. 利用yum下载paramiko依赖的rpm软件包 安装yum-utils yum -y install yum-utils yumdownloader python-setuptoolsyumd ...
- 详解 awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}每个字段的意思
用这个列子说好了如果NF代表字段 那最后应该是7 才对啊 还有最后怎么都是1呢?END前面的是查看并发吧 后面是查看 tcp连接数 是这样吗? awk下标采用字符串来表示可能你在其它语言见 ...
- laravel 安装语言包
一.composer依赖网站地址:https://packagist.org/ 二.在搜索框输入: laravel-lang 三.点击进入,根据自己的版本进行安装: composer require ...
- vue“欺骗”ueditor,实现图片上传
一.环境介绍 @vue/cli 4.3.1 webpack 4.43.0 ueditor1.4.3.3 jsp版 二.springboot集成ueditor,实现分布式图片上传 参考我的另一篇博客,& ...
- IDEA去掉Autowired的黄色背景和对象的红线
Intellij idea @AutoWired注入bean 出现红色波浪线,@autowird下面显示黄色波浪线或者标黄,如下图,解决方法总结一下供大家使用 首先选择File--Settings- ...
- 架构师写的BUG,非比寻常
部门新来了个架构师,BAT背景,住在三环,开宝马上班,有车位. 小伙话不多,但一旦说话斩钉截铁,带着无法撼动的自信.原因就是,有他着数亿高并发经验,每一秒钟的请求,都是其他企业运行一年也无法企及的.这 ...