Java中不得不谈的值传递和地址传递
个人的一些认识,希望能对初学Java的你,或者困惑于方法参数传递的你祈祷一丝帮助!
下面是一些作者的个人观点,如果有错,欢迎各位大牛指出错误,灰常感谢您的观看与支持...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
今天学习Java的时候,看见书中提及方法参数传递
有按值传递 和按地址传递;
我们如何判断一个类中它采用的值传递还是引用传递呢,我们要看类中的形参。 如果形参的数据是基本数据类型,那么我们就可以断定他是值传递,
eg. 本包中的People.java 和Human.java 中有对值传递的介绍;
package com.baidu;
public class People {
public static void main(String[] args) {
// TODO Auto-generated method stub
Human human = new Human("dengchunlai");
//human.yang(); 不能这样使用,因为 String yang是定义的字符串类型的类(变量),不是方法;
//human.yang;//不能这样使用;
String ming = human.yang;
System.out.println(human.yang); //但可以这样使用;
System.out.println(ming);
}
}
package com.baidu;
public class Human {
String yang;
public Human(String st1) {
// TODO Auto-generated constructor stub
yang = st1;
}
}
上面的源代码是Java中的按值传递:
那什么是引用传递呢?
如果形参里的数据为 类 ; 那么我们就断定他是引用传递; (*)按引用传递参数时,被调用的方法中的代码将直接访问原始对象 ->[按引用传递的基础]
package com.baidu;
class Data {
String msg;
public Data(String str) {
// TODO Auto-generated constructor stub
this.msg = str;
}
// public Data() {
//
// }
}
package com.baidu;
public class DataPrinter {
void print(Data d) {
System.out.println(d.msg);
}
public void setMsg(Data d) {
d.msg = "Hello to Java ! ";
}
}
public class MethodCallDemo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Data data = new Data("Hello from Java !"); //创建了一个Data类对象的一个引用data,同时new了一个有参的构造函数;
DataPrinter dp = new DataPrinter();
// System.out.println("第一次输出结果;"+ data.msg);
dp.setMsg(data);
System.out.println("第二次输出结果:"+data.msg);
}
}
证明()里是一个无参的构造方法:
[个人心得]:在编写代码的时候发现 Data data = new Data("Hello from java !");
在使用这句语句的时候我在Data 我们需要在类中建立一个带字符串型的形参的构造方法;
由于在之前单独使用创建的时候是调用无参的构造函数,我在想他放到构造一个默认的无参的构造函数呢,于是我在Data类中构造了一个无参的
但事实证明,程序出现报错,由此可证明()中确实是一个构造函数,但为什么不显示他的构造函数呢,第一句语句new的是一个构造函数,且并不显示,可能由于系统默认吧!
言归正传:
这个代码的核心就是 dp.setMsg(data); 我们怎么理解呢,DataPrinter类中的设置器中的形参是Data d; 他这么设置形参的原因是什么呢,可能由于主方法的 dp.setMsg(data); 是要求Data类,所以引用传递,由于(按引用传递参数时,被调用的方法中的代码将直接访问原始对象),所以setMsg()这个方法里面的代码 可以直接访问Data这个原始类的原始对象String msg;
Java中不得不谈的值传递和地址传递的更多相关文章
- JAVA中获取文件MD5值的四种方法
JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...
- C语言:值传递,地址传递和引用传递(example:值交换)
于C语言中值传递.地址传递和引用传递的我个人理解. 通过一个例子:swap(交换两个整型变量的值)来表现! #include <stdio.h> void swap1(int* a,int ...
- “equals”有值 与 “==”存在 “equals”只是比较值是否相同,值传递,==地址传递,null==a,避免引发空指针异常,STRING是一个对象==null,对象不存在,str.equals("")对象存在但是包含字符‘''
原文链接:http://www.cnblogs.com/lezhou2014/p/3955536.html "equals" 与 "==" "equa ...
- C语言 值传递和地址传递
不少同学在学到C语言的指针部分时感到很困惑,对经常提到的"值传递"和"地址传递"两个概念弄不 明白.实际上,因为地址本身也可以作为一个特殊的"值&qu ...
- C语言参数传递(值传递、地址传递)+二级指针
参数传递 C语言参数传递一般分为:值传递和地址传递(本质上只有值传递) (注意:C语言中没有引用传递,C++才有引用传递,因为很多C语言环境是用C++编译器编译,使得C看起来支持引用传递,导致很多网上 ...
- C#函数的参数传递方式1(值传递与地址传递)
using System; namespace class1 { class program { static void Main(string[] args) { //值传递引用,实际参数不会变化 ...
- c语言进阶9-值传递与地址传递
一. 函数的值传递 函数的值传递是指参数为基本类型时,如整型.浮点型.字符型(特指单字符型)时,参数传递时是从实参拷贝一份值传给形参,形参的变化不会影响实参的值. 1. 基本类型做参数 ...
- Java中传参的值传递和引用传递问题(转)
今天遇到了一个java程序,需要用参数来返回值(虽然最后用另一种方法实现了),在网上看到这样一篇文章,很受启发. 本文章来自于http://hi.baidu.com/xzhilie/blog/item ...
- Java中的值传递和地址传递(传值、传引用)
首先,不要纠结于 Pass By Value 和 Pass By Reference 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中.更何况,要想知道 ...
随机推荐
- dij模板
#include<cstdio> #include<vector> #include<queue> using namespace std; struct edge ...
- David与Vincent的博弈游戏[树型DP]
\(\mathcal{Description}\) \(\mathcal{Solution}\) 根据题意,我们知道 根节点深度为1,深度为 奇数 的节点由\(David\)移动,我们称为\(D\)点 ...
- java和golang通过protobuf协议相互通信
目录 整体结构说明 protobuf2文件 golang客户端 目录结构 生成pb.go文件 main.go util.go java服务端 目录结构 pom.xml application.yml ...
- get 请求和post请求的具体区别
get请求是向服务器索要数据,post请求是向服务器传送数据 的,浏览器限制了get的传送量,post可以大量的把数据传给 服务器,一般情况下get请求,请求体是空的,请求只发一次 ,如果是post请 ...
- SD卡操作
读写SD卡 Context类的openFileInput和openFileOutput方法都是针对应用程序的数据文件夹进行的文件操作,由于手机的ROM容量有限,因此这种操作有一定局限性. 手机的SD卡 ...
- win7 磁盘碎片整理
最近每天早上开机,都出现开机正常,但是所有软件都没法点开,性能特别差: 咨询了运维小伙伴,提示可以整理下电脑磁盘碎片试试.那么如何整理呢,如下详细说明 1.先整理C盘,打开我的电脑,在C盘上,右击-- ...
- es6,@import一直报错 Can't resolve。。
最近在项目中新增了一个按钮组的组件页面,但是在其他页面引入时,一直报错 引入方式:
- leetcode并发题目解题报告JAVA版
一.Print in Order Suppose we have a class: public class Foo { public void first() { print("first ...
- php 获取未来七天的日期和星期
php获取未来七天的日期和星期代码 for($i=4;$i<8;$i++){ $dateArray[$i]=date('Y-m-d',strtotime(date('Y-m- ...
- Vue监听键盘回车事件
在写页面时遇见了登录页需要加一个键盘回车事件. vue 的 v-on中有这样的修饰符 <input v-on:keyup.enter="submit"> 即<in ...