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 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中.更何况,要想知道 ...
随机推荐
- sudo ln -sf libhiredis.so.0.10 libhiredis.so.0
which ldconfig sudo ln -sf libhiredis.so.0.10 libhiredis.so.0
- 洛谷P2472 [SCOI2007]蜥蜴 题解
题目链接: https://www.luogu.org/problemnew/show/P2472 分析: 这道题用最大流解决. 首先构建模型. 一根柱子可以跳入和跳出,于是拆成两个点:入点和出点. ...
- c++小游戏——三国杀
#include<iostream> #include<time.h> #include<stdio.h> #include <stdlib.h> us ...
- C#3.0新增功能09 LINQ 基础02 LINQ 查询简介
连载目录 [已更新最新开发文章,点击查看详细] 查询 是一种从数据源检索数据的表达式. 查询通常用专门的查询语言来表示. 随着时间的推移,人们已经为各种数据源开发了不同的语言:例如,用于关系数据 ...
- CentOS 下编译安装MySQL
CnetOS 下编译安装 MySql 查看是否存在旧版本: rpm -qa | grep mysql 卸载旧版本: rpm -e mysql #普通删除模式 rpm -e --nodeps mys ...
- .NET开发框架(八)-服务器集群之网络负载平衡演示(视频)
(有声视频-服务器集群之负载平衡-NLB演示) 观看NLB视频的童鞋,都会继续观看IIS的负载平衡教程,点击>> 本文以[图文+视频],讲解Windows服务器集群的网络负载平衡NLB的作 ...
- Gordon家族(一)
引子 Go语言的吉祥物是一只囊地鼠(gopher),由插画师Renee French设计,名叫Gordon,长得这个样子: 在Go官网上(https://golang.google.cn/)的Gord ...
- 勘误:EOS资源抵押退还
关键字:勘误,delegatebw,undelegatebw,listbw,资源管理,抵押,解抵押,返还资源 EOS中,资源抵押与解抵押是通过一对命令完成的:delegatebw,undelegate ...
- EF Core的Code First 基础
一.创建实体类与映射类 通过NuGet引用Microsoft.EntityFrameworkCore 1.创建实体类 Code First可以通过为实体类字段添加相应特性,来创建对应的字段类型等,举例 ...
- 【Android】SDK Manager 设置代理
这里是 Mac 系统下,Windows 环境类似.打开 Android SDK Manager, Proxy Settings 设置如下所示: PS: 注意勾选 "Force https:/ ...