内存的讲解

我们想学习对象的引用和传递,就得先来复习两块内存空间

栈内存:可以理解为每块栈内存都是一个整型变量,它能存放一块堆内存的物理地址数值(仅能存放一块)

堆内存:堆内存可以存放一个对象的具体信息,每一块堆内存空间的开辟都需要通过关键字new完成。

我们来举个实例,来看看内存空间的状态

代码演示:

package demo;class Book{private String title;private double price;public Book(){}public Book(String title,double price){this.title = title;this.price = price;}public String getTitle() {return title;}public double getPrice() {return price;}public void setTitle(String title) {this.title = title;}public void setPrice(double price) {this.price = price;}public String toString() {return "Book [title=" + title + ", price=" + price + "]";}
}
public class InStantDemo {public static void main(String[] args) {  Book book;                  //声明一个对象book = new Book();         //实例化一个对象book.setTitle("java");       //对titlt属性赋值book.setPrice(65.0);        //对price属性赋值System.out.println(book.toString());}
}

内存空间:

代码讲解:在第二个图,我们可以看到对象调用无参构造实例化的时候,属性值都会有一个默认值。

值传递和址(地址)传递

面向对象编程中,都应该记得:面向对象编程 = 对象 + 消息的传递。所以学习面向对象编程(java)最为重要的就是学习消息的传递

在java中,三大特征之一的封装,就将很多的方法封装成了一块一块的代码块,还将一类型的事务封装成类,

而方法都是一个入口(参数的传递)一个出口(return关键字)。

学习参数前,我们先来学习参数的传递,可分为:值(基本数据类型)传递和址(引用数据类型)传递

代码演示:

package demo;public class ParamTransmitDemo {//定义一个方法用来交换a和b的数值public static void change(int a,int b){System.out.println("传入时形参a的值="+a);System.out.println("传入时形参b的值="+b);//定义一个第三方变量,实现a和b的数值交换int temp = a;a = b;b = temp;System.out.println("修改后形参a的值="+a);System.out.println("修改后形参b的值="+b);}public static void main(String[] args) {int a = 10;int b = 20;//调用方法交换a和b的数值change(a, b);System.out.println("实参a的值="+a);System.out.println("实参b的值="+b);}
}

代码结果:

代码讲解:能够发现,并没有实现,参数传入方法后,就称为形参,我们能够看到在方法体内,确实实现了a和b的值的交换,但是实参a和b并没有交换,我来给大家先来解释一下实参和形参。

实参:实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。

形参:形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。形参类似于实参的副本,我们调用函数修改的只是实参的副本,并不会对实参有任何改变。

需要注意:

1.实参和形参在数量上,类型上、顺序上应严格一致,否则就会发生类型不匹配的错误。

2.实参--->形参:在参数的传递上,如果参数类型是基本数据类型,参数传的就是实参的数值,分配的形参存放的是实参的副本,修改后不会改变实参。

3.实参--->“实参”:在参数的传递上,如果参数类型是引用数据类型,此时参数的传递一定是地址值,即实参和形参指向的是同一块地址空间,当形参修改,实参也会跟着改变。

我们还是使用上述例子,使用包装类,修改代码,完成实参--->“实参”

代码演示:

package demo;public class ParamTransmitDemo {public static void change(int[] num){int temp = num[0];num[0] = num[1];num[1] = temp;}public static void main(String[] args) {int[] num = new int[2];num[0] = 10;num[1] = 20;change(num);System.out.println(num[0]);            //20System.out.println(num[1]);            //10}
}

代码讲解:上述代码就用了引用数据类型——数组传递,演示了实参--->“实参”。

bigdodo给大家出个题

下面代码使用了引用类型变量实现址传递

代码演示:

package demo;public class ParamTransmitDemo {public static void change(Integer m,Integer n){Integer c = null;c = m;m = n;n = c;}public static void main(String[] args) {//使用包装类,定义两个引用类型对象并赋值Integer x = new Integer(10);Integer y = new Integer(20);change(x, y);System.out.println(x);        //10System.out.println(y);        //20}
}

提问:数据为什么没有交换?欢迎评论留言回答,实现想不出,也可以留言提问bigdodo!

二十、对象的引用与传递相关推荐

  1. Java学习总结——对象的引用与传递

    拾柒--对象的引用与传递 一.初步了解引用传递 引用传递也称为传地址,指的是在方法调用时,传递的参数是按引用进行传递,其实传递的是引用的地址,也就是变量所对应的内存空间的地址. 方法调用时,若实际参数 ...

  2. 信号发送,槽函数执行,过程中传递的是对象的引用,涉及的拷贝操作

    如果qt的信号和槽之间发送的是对象的引用,传递过程中会发生拷贝操作. 一.跨线程之间 #ifndef __MAIN_WINDOW_H_ #define __MAIN_WINDOW_H_#include ...

  3. Java中对象和引用的理解

    2019独角兽企业重金招聘Python工程师标准>>> 偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两 ...

  4. c6011取消对null指针的引用_COM编程攻略(二十二 IDL中的枚举,指针,数组)

    上一篇: Froser:COM编程攻略(二十一 异步)​zhuanlan.zhihu.com 本篇主要讲idl的一些语法特性. idl的语法和C语言非常类似,但是它扩展了一些特性,这些特性用于兼容其它 ...

  5. ES6 (二十二)Class 的继承、extends关键字、super 关键字(函数调用(constructor)、对象(父类原型对象))、原型对象(原型链)、Mixin 模式

    ES6 (二十二)Class 的继承.extends关键字.super 关键字(函数调用(constructor).对象(父类原型对象)).原型对象(原型链).Mixin 模式 文章目录 ES6 (二 ...

  6. Activity Fragment数据传递(对象)引用不变问题

    一.背景 一天写代码出了bug,Activity传给fragment的arraylist经过fragment中的修改居然会改变activity的arrayList(之前传给fragment的那个),当 ...

  7. 经典 Python参数传递采用的肯定是“传对象引用”的方式。相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象

    python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是"传对象引用"的方式.这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或 ...

  8. Kotlin学习笔记 第二章 类与对象 第十二 十三节 对象表达式与对象声明 类型别名

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  9. 当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的.

    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递 答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个参数被传 ...

  10. python对象传递_Python参数传递对象的引用原理解析

    大家都知道在python中,一切皆对象,变量也不再具有类型,变量仅仅是对象的一个引用,我们通常用变量来测类型,通常测得就是被这个变量引用得对象的类型. python采用的是传递对象的引用,为了方便说明 ...

最新文章

  1. 生成对抗网络是什么?
  2. 修改PHP session 默认时间方法
  3. [以太坊源代码分析]III. 挖矿和共识算法的奥秘
  4. ajax 同步怎么回调,Ajax jquery同步回调成功
  5. 单机android游戏排行榜,安卓单机手机游戏推荐_十大必玩单机手机游戏
  6. mysql数据库内置函数大全_(MariaDB)MySQL内置函数大全
  7. 《Go语言程序设计》读书笔记(七)基于共享变量的并发
  8. PyTorch系列入门到精通——BN、LN、IN and GN
  9. 函数名,闭包,装饰器
  10. Codeforces - 474D - Flowers - 构造 - 简单dp
  11. 两部委联合查处一批网店侵权 淘宝易趣成重灾区
  12. 找零钱问题系列之记忆搜索
  13. 超全面!完全没有设计基础的新手如何做好PPT配色?(附神器)
  14. 给 Android 开发者的 Kotlin 教程(一)
  15. java将明文变为密文,使用java编程实现明文和密文之间的互转
  16. SEO外推福利:外链高收录平台与外链类型分析
  17. 为什么物理诺奖颁给量子信息科学?——量子信息的过去、现在和未来
  18. 单片机开发,口袋秤单片机芯片的开发流程
  19. IO测试软件–orion
  20. 南方iData数据工厂(一个平台,一套数码,一体化生产):构建基础空间数据的好平台

热门文章

  1. Android 设计模式:(一)策略模式 —— 封装行为的大局观
  2. 自己写的一个分享按钮的插件(可扩展,内附开发制作流程)
  3. 有了net send,谁还用IM?
  4. 拓端tecdat|R语言GGPLOT2绘制KOLMOGOROV-SMIRNOV KS检验图ECDF经验累积分布函数曲线可视化
  5. 拓端tecdat:R语言STAN贝叶斯线性回归模型分析气候变化影响北半球海冰范围和可视化检查模型收敛性
  6. 拓端tecdat|基于keras平台CNN神经网络模型的服装识别分析
  7. 拓端tecdat|R语言泊松Poisson回归模型分析案例
  8. 计算机网络-路由器广域网配置
  9. Android入门笔记02
  10. pytorch冻结模型