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 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中.更何况,要想知道 ...
随机推荐
- java ServletContextListener 实现UDP监听
使用spring boot实现项目启动时的监听, UDPListener import java.io.IOException;import java.io.UnsupportedEncodingEx ...
- SpringBoot | 第三十八章:基于RabbitMQ实现消息延迟队列方案
前言 前段时间在编写通用的消息通知服务时,由于需要实现类似通知失败时,需要延后几分钟再次进行发送,进行多次尝试后,进入定时发送机制.此机制,在原先对接银联支付时,银联的异步通知也是类似的,在第一次通知 ...
- Anacodna之conda的使用
yum install -y bunzip2 wget https://repo.continuum.io/archive/Anaconda2-5.0.1-Linux-x86_64.sh chmod ...
- 记一次搭建ftp服务器的简略经历
需求:在linux中搭建一个ftp 服务器,用户为:user1 目录为 /data/use1 , 安全设置:限制权限,只能访问自己目录,限制端口,只允许特定ip访问. 1,安装vs ...
- jquery实现最简单的下拉菜单
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 2019前端面试系列——JS面试题
判断 js 类型的方式 1. typeof 可以判断出'string','number','boolean','undefined','symbol' 但判断 typeof(null) 时值为 'ob ...
- android 界面提示框架WisdomProgressHUD,为金典而生
一:简述 今天给android开发者们,推荐一个金典的界面提示框架WisdomProgressHUD,使用简洁方便. WisdomProgressHUD 是一个半透明的 HUD 指示器. Wisdom ...
- Shell基本语法---shell的变量以及常见符号
变量 1. 不同于其它语言需要先声明变量 2 .等号的两边不能有空格 3. 调用变量: $a 或者 ${a} a=; echo $a; echo ${a} 变量 变量意思 $? 判断上一条命令执行的 ...
- Python3数据驱动ddt
对于同一个方法执行大量数据的程序时,我们可以采用ddt数据驱动的方式,来对数据规范化整理及输出 一.需要使用python的ddt库,ddt,data,unpack方法 1.仅使用ddt和data,代码 ...
- HC-08 BLE资料
1.1 特点简介 HC-08蓝牙串口通信模块是新一代的基于Bluetooth Specification V4.0 BLE蓝牙协议的数传模块.无线工作频段为 2.4GHz ISM,调制方式是 GFSK ...