zoukankan      html  css  js  c++  java
  • 牛客_Java_值传递(拷贝)不该表原来变量+传引用的话会一起改变

    总结:

    许多编程语言都有2种方法将参数传递给方法------按值传递和按引用传递。 

      与其他语言不同,Java不允许程序员选择按值传递还是按引用传递各个参数,基本类型(byte--short--int--long--float--double--boolean--char)的变量总是按值传递。就对象而言,不是将对象本身传递给方法,而是将对象的的引用或者说对象的首地址传递给方法,引用本身是按值传递的-----------也就是说,讲引用的副本传递给方法(副本就是说明对象此时有两个引用了),通过对象的引用,方法可以直接操作该对象(当操作该对象时才能改变该对象,而操作引用时源对象是没有改变的)。 

      现在说说数组:如果将单个基本类型数组的元素传递给方法,并在方法中对其进行修改,则在被调用方法结束执行时,该元素中存储的并不是修改后的值,因为这种元素是按值传递,如果传递的是数组的引用,则对数组元素的后续修改可以在原始数组中反映出来(因为数组本身就是个对象,int[] a = new int[2];,这里面的int是数组元素的类型,而数组元素的修改是操作对象)。 

      对于单个非基本类型数组的元素在方法中修改,则在被调用方法结束执行时,该元素中存储的是修改后的值,因为这种元素是按引用传递的,对象的改动将在源数组的数组元素中反映出来。

     
     
    [单选题]
    检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package algorithms.com.guan.javajicu; 
    public class Example { 
      String str = new String("good"); 
      char[] ch = {'a','b','c'}; 
      public static void main(String[] args) { 
         Example ex = new Example(); 
         ex.change(ex.str, ex.ch); 
         System.out.print(ex.str +"and"); 
         System.out.print(ex.ch);  
      
        
      public void change(String str, char ch[]){ 
         str= "test ok"
         ch[0]= 'g'
      
    • test okandabc
    • test okandgbc
    • goodandabc
    • goodandgbc

    解释:

      (1)java 中String是 immutable的,也就是不可变,一旦初始化,其引用指向的内容是不可变的。也就是说,String str = “aa”;str=“bb”;第二句不是改变“aa”所存储地址的内容,而是另外开辟了一个空间用来存储“bb”;同时由str指向原来的“aa”,现在已经不可达,GC时会自动回收。因此String作为参数传进来时候,str= "test ok"; 实际给副本引用str指向了新分配的地址,该地址存储“test ok”。
          (2)String是值传递,数组的引用传递。
                  为什么后面的数组就是传引用呢?
           一篇讲String值传递的博文
    因此,原先的str仍然指向“good”
  • 相关阅读:
    模型评估方法
    欠拟合、过拟合、偏差、方差
    机器学习基本概念
    Hive 的基本概念
    Flume的Channel
    Flume的Sink
    Flume的Source
    Flume 安装和配置
    Flume的基本概念
    BIO & NIO & NIO常见框架
  • 原文地址:https://www.cnblogs.com/snowwhite/p/4751302.html
Copyright © 2011-2022 走看看