八大数据类型和String 在进行传递的时候  不会改变.

八大数据类型

public class parameterValue {    //值传递
public static void main(String[] args) {
int x = 10;
method(x);
System.out.println(x);
}
public static void method(int mx) {
mx = 20;
}
/**
* 在栈内存中申请mx 这时候 x 和mx 存储的值 是一样的,但是x和mx的地址是不一样的,mx=20;并不影响x的值.
* 八大基本数据类型都是这个吊样.
* */
}

String

package oneDay;

public class RefDemo1 {
public static void main(String[] args) {
String nameString = "小飞"; String yuanString;
yuanString = new String("asd");
System.out.println(yuanString); method(nameString);
System.out.println(nameString);
}
private static void method(String name) {
name = "小贝"; // 相当于 name = new String(); name = "小贝";
// 相当于 指向改变
/**
* 简单解释一下. String nameString 相当于在栈空间中申请了一块空间,用于存储引用地址(此时没有引用地址为空).
* nameString = 小飞; 相当于 nameString = new String("小飞"); 这时候 在堆内存申请了一块空间用于存储 实际的值.
* 也就是说 在method 这个方法 当中. 形参 String name 相当于 String name; name = nameString; 这时候 name和nameString在栈内存中
* 存储的引用地址 是一样的 , 当时当
* name = "小贝";的时候 该代码 相当于 name = new String("小贝"); 在堆内存中新申请了一块空间, 将该地址 赋予name 这时候 name和nameString在栈内存中
* 存储的值(引用地址) 就又不一样了. 所以 八大基本数据类型和String 一样 在 方法中进行传递的时候 不会改变自身的值, 但是 类 可以改变自身的值..
* * */
}
}

package oneDay;

public class RefDemo {        //引用传递
public static void main(String[] args) {
Duck duckYuan = new Duck();
System.out.println("Duck age = "+duckYuan.age);
method(duckYuan);
System.out.println("Duck age = "+duckYuan.age);
}
private static void method(Duck duck) {
duck.age = 5;
}
/**
* Duck duckYuan = new Duck(); 在栈内存和堆内存中申请空间,并将 堆内存的地址 放入栈内存中,以待使用.
* 形参中的 Duck duck 在栈内存中申请空间,并将上面的duckYuan内存储的堆内存的地址放入duck中,
* 然后 方法内的duck.age = 5; 这时候的duck和duckYuan栈内存地址虽然不同,但期内存储的堆内存的地址 都是指向同一块堆内存地址的,这样就改变了原来的值.
*
* */
} class Duck{
int age = 2; //省略封装
}

为什么   String也是类但是   不会改变呢? 总结一下:

在两个方法当中

name = "小贝";
duck.age = 5;
/**
* 八大基本上数据类型属于值传递.
* String以及其余的引用数据类型属于引用传递.
* 八大基本数据类型和String 不会改变其内容 , 其余的会改变内容.
* 八大基本数据类型: 新申请了栈内存空间, 在函数内的 所有操作都是针对形参的, 无论怎样搞, 都不会改变实参的值.
* String: 新申请了占内存空间, 但是改变String的值的时候, 会将新的堆内存的空间地址放到栈内存当中, 这样的话原本的栈内存和堆内存都没有发生变化, 所以String也不会变.
* 对于普通的引用数据类型, 在调用函数的时候: 新申请的形参存储的是原本引用数据类型的堆内存的地址, 在修改数据的时候会改变原来堆内存的内容. 和String的栈内存堆内存都不变相比, 这里改变了堆内存的内容, 所以值发生变化.
*
* 可以做一个实验, 在普通引用数据类型做形参的时候, 不改变堆内存的内容, 先改变一下 栈内存的地址, 这样也不会发生变化.
*/

JAVA值传递和引用传递 以及 实参是否改变的更多相关文章

  1. 【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?

    科普: 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 引用传递(pass by reference)是指在 ...

  2. java基础 - 形参和实参,值传递和引用传递

    形参和实参 形参:就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的. 形参只有在方法被调用的时候,虚拟机才会分配内存单元,在方法调用结束之后便会释放所分配的内存单元. 因此,形 ...

  3. Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义

    一.Java中什么叫做引用类型变量?引用:就是按内存地址查询       比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...

  4. 理解java值传递与引用传递

    1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型.基本类型的变量保存原始值,即它代表的值就是数值本身:而引用类型的变 ...

  5. 一道笔试题来理顺Java中的值传递和引用传递

      题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...

  6. Java中的值传递与引用传递

    1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型. 基本类型的变量保存原始值,即它代表的值就是数值本身: 而引用类型 ...

  7. 堆栈详解 + 彻底理解Java的值传递和引用传递

    本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...

  8. JAVA不可变类与可变类、值传递与引用传递深入理解

    一个由try...catch...finally引出的思考,在前面已经初步了解过不可变与可变.值传递与引用传递,在这里再次深入理解. 1.先看下面一个try..catch..finally的例子: P ...

  9. 【Java】 参数的传递:值传递与引用传递讨论

    内容稍多,可直接看第4点的讨论结果 前言 在涉及到传递参数给方法时,容易出现一些参数传递错误的问题,这就涉及到了参数的传递问题,必须搞清楚:参数是如何传递到方法中的?一般来说,参数的传递可以分为两种: ...

  10. 关于java是值传递还是引用传递

    一.概念 实际上对这两种传递方式,知乎上有个回答说得很好: 值传递和引用传递,属于函数调用时参数的求值策略(Evaluation Strategy),这是对调用函数时,求值和传值的方式的描述,而非传递 ...

随机推荐

  1. 2017多校Round4(hdu6067~hdu6079)

    补题进度:10/13 1001 待填坑 1002(kmp+递推) 题意: 有长度为n(<=50000)的字符串S和长度为m(m<=100)的字符串T,有k(k<=50000)组询问, ...

  2. powerDigner使用

    PowerDesigner是一款功能非常强大的建模工具软件,足以与Rose比肩,同样是当今最著名的建模软件之一.Rose是专攻UML对象模型的建模工具,之后才向数据库建模发展,而PowerDesign ...

  3. service mesh架构

    service  mesh 系列文章 https://my.oschina.net/iamlipeng/blog/1631575 http://developer.51cto.com/art/2018 ...

  4. delphi 的结构体对齐关键字

    Align fields (Delphi)   Go Up to Delphi Compiler Directives (List) Index Type Switch Syntax {$A+}, { ...

  5. 【APUE】fork函数

    #include <unisth.h> pid_t fork(void) fork函数被调用一次,返回两次.子进程的返回值是0,父进程的返回值是子进程的进程id. fork函数调用一次却返 ...

  6. ExtJS学习-----------Ext.Object,ExtJS对javascript中的Object的扩展

    关于ExtJS对javascript中的Object的扩展.能够參考其帮助文档,文档下载地址:http://download.csdn.net/detail/z1137730824/7748893 以 ...

  7. Asp.net MVC 简单分页 自做简单分页

    Asp.net MVC 简单分页:   public static string Pager(int page,int pageSize,int total)         {           ...

  8. LoadRunner系列之—-02 基于webservice协议的接口测试(脚本实例)

    Loadrunner 基于webservice协议的接口压力测试(脚本实例) 接口功能如下:请求接口,报文只有一个参数为证件号码:返回报文中,有证件号码是否能查到对应数据,查到几条数据. 思路:请求w ...

  9. Cookie防伪造防修改 电商课题:cookie防篡改

    主要防止非法用户修改cookie信息,以及cookie的超时时间 传统cookie存储,Cookie(name, value),value很容易就被篡改. 防修改cookie存储,Cookie(nam ...

  10. 算法导论学习之线性时间求第k小元素+堆思想求前k大元素

    对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...