Java基础——值传递
值传递?
参数传递的值的拷贝,改变拷贝不影响原参数。
引用传递?
参数传递的是参数本身,改变形参,实参也改变。
Java中是什么传递?
Java中只有值传递
实际情况为什么不对呢?
1. 基本数据类型
public class Main {
void method01(int a ){
a++;
System.out.println("a in method01 is "+a);
}
public static void main(String[] args) {
Main main = new Main();
int a = 12;
main.method01(a);
System.out.println(a);
}
}
输出结果:
a in method01 is 13
12
没有问题,原值没有改变。
2. String类型
public class Main {
void method02(String s){
s = "world";
System.out.println("string in method is "+s);
}
public static void main(String[] args) {
Main main = new Main();
String s = "hello";
main.method02(s);
System.out.println(s);
}
}
输出结果:
string in method is world
hello
没有问题,是值传递。原值没有改变
3. 自定义类
public class Main {
void method03(Cat cat){
cat.setName("haha");
System.out.println("cats name is "+cat.getName());
}
public static void main(String[] args) {
Main main = new Main();
Cat cat = new Cat();
cat.setName("mimi");
main.method03(cat);
System.out.println("cats name in main is "+cat.getName());
}
}
class Cat{
String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
输出结果:
cats name is haha
cats name in main is haha
不对!为什么值传递原值改变了??????
注意了,这里虽然原值改变了,但是还是值传递。为什么呢?
因为传递的是参数的引用的拷贝也是值传递,这里的值指的是地址的拷贝。
这里举一个简单的例子(引用地址:https://www.cnblogs.com/wchxj/p/8729503.html)
值传递:你有一把钥匙,当你的朋友想要去你家的时候,你复刻了一把新钥匙给他,自己的还在自己手里,这就是值传递。这种情况下,他对这把钥匙做什么都不会影响你手里的这把钥匙。
引用传递:你有一把钥匙,当你的朋友想要去你家的时候,如果你直接把你的钥匙给他了,这就是引用传递。这种情况下,如果他对这把钥匙做了什么事情,比如他在钥匙上刻下了自己名字,那么这把钥匙还给你的时候,你自己的钥匙上也会多出他刻的名字。
当你使用值传递,拷贝一份钥匙给你朋友后,你朋友在你家砸了电视,那么你回家的时候电视肯定是被砸了的。
这个例子理解起来就容易多了。按照这个逻辑我们来测验一下。
如果Java传递的只是引用的拷贝的话,我们将形参指向null,那么实参不会受到影响。通过上面的例子来解释就是,如果你给你朋友的钥匙只是一把复制的钥匙的话,我们将朋友手上的钥匙摧毁,我们还是能通过钥匙原件开门。
public class Main {
void method04(Cat cat){
//摧毁朋友手中的钥匙
cat = null;
try {
System.out.println(cat.getName());
}catch (Exception e){
e.printStackTrace();
System.out.println("cat 已经被回收!");
}
}
public static void main(String[] args) {
Main main = new Main();
Cat cat = new Cat();
cat.setName("mimi");
main.method04(cat);
System.out.println(cat.getName());
}
}
class Cat{
String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
输出结果:
java.lang.NullPointerException
at Main.method04(Main.java:21)
at Main.main(Main.java:44)
cat 已经被回收!
new name
没错!就是这样。
所以Java中只有值传递。
Java基础——值传递的更多相关文章
- Java是值传递还是引用传递?
Java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题.这个问题一般是相对函数而言的,也就是Java中所说的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法的两 ...
- 堆栈详解 + 彻底理解Java的值传递和引用传递
本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...
- Java的值传递和引用传递的说法
学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java ...
- 数据存储在哪里? Java是值传递还是引用传递?
寄存器 : 最快的存储区,位于处理器中,寄存器会按需求自行分配空间,java不能控制寄存器,所以在程序中感觉不到它的存在 栈(stack) : 位于RAM(内存)中,速度仅次于寄存器,存储对象的引用( ...
- 如何理解Java的值传递
结论 为了加深印象,先把结论放在文章开头. ++Java中只有值传递++. 形参与实参 在理解Java的值传递 实参Argument 实际参数,主调用函数传递给调用函数的参数 形参Parameter ...
- Java 为值传递而不是引用传递
——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...
- java的值传递笔记
1. 背景:开发小伙伴突然问我java是值传递还是引用传递,我说当然是值传递,只不过有时候传递一个对象时实际传递的是对象的地址值,所以让人容易产生一种引用传递的假象,貌似在李刚的疯狂java讲义有提到 ...
- java是值传递还是引用传递
首先写一个简便的Employee,以便测试使用. class Employee { private String name; public Employee(String name) { this.n ...
- Does Java pass by reference or pass by value?(Java是值传递还是引用传递) - 总结
这个话题一直是Java程序员的一个热议话题,争论不断,但是不论是你百度搜也好还是去看官方的文档中所标明的也好,得到的都只有一个结论:Java只有值传递. 在这里就不贴代码细致解释了,让我们来看看一些论 ...
随机推荐
- Pycharm----设置默认脚本请求头
每次新建py文件,均需要在文件头部加上编码声明,每次的手动添加比较麻烦,因此设置自动生成,也可添加作者.时间等等,详见如下: 设置后的样例显示: 操作方式: 操作完如上的截图步骤,再次新建一个py文件 ...
- 2019牛客多校第四场J free——分层图&&最短路
题意 一张无向图,每条边有权值,可以选择不超过 $k$ 条路使其权值变成0,求 $S$ 到 $T$ 的最短路.(同洛谷 P4568) 分析 首先,分层图最短路可以有效解决这种带有 「阶段性」的最短路, ...
- SQL分表
一.为什么要水平分表?简而言之,当单表数据量过大时,无法对其进行有效的维护,以及查询速度严重变慢时,我们就需要对其时行水平分表. 二.什么时候需要水平分表?在数据库结构的设计中,需要充分考虑后期数据的 ...
- JMeter性能测试工具
1.官网资源 地址:https://jmeter.apache.org/download_jmeter.cgi window下载zip版本 options配置-选择语言-简体(jmeter.prope ...
- 如何通过Thread查看一个方法被调用的顺序
Test1 package com.dwz.concurrency.chapter11; public class Test1 { private Test2 test2 = new Test2(); ...
- AGC024E Sequence Growing Hard
题意 给出\(n\),\(m\),\(mu\),问有多少个序列组\((A_0,A_1,\dots,A_n)\)满足: 序列\(Ai\)的长度恰好为\(i\) 所有元素均在\([1,m]\) \(A_{ ...
- 2015 ACM Arabella Collegiate Programming Contest
题目链接:https://vjudge.net/contest/154238#overview. ABCDE都是水题. F题,一开始分类讨论,结果似乎写挫了,WA了一发.果断换并查集上,A了. G题, ...
- 使用Android手机作为树莓派的屏幕
在使用树莓派时,有时出于应急,身边没有屏幕,或者外出携带时也不方便带着屏幕走.如果能使用随身携带的智能手机当做其屏幕,则会方便许多.看看效果,一个树莓派+充电宝+手机,就会非常有用了. 满足以下条件即 ...
- SQL连接查询基础知识点
什么是连接 连接(join)查询是基于多个表中的关联字段将数据行拼接到一起,可以同时返回多个表中的数据. 下面以两个表为例子,举例说明一下不同的连接. SELECT * FROM products i ...
- Flask-login 原理
1 login_required 内部原理,主要是判断当前用户是否已经授权访问,如果没被授权就调用current_app.login_manager.unauthorized() current_us ...