精华内容
下载资源
问答
  • java核心技术卷I里一个结论我觉得挺有意思:java中没有引用传递,只有值传递首先看定义:值传递,是指方法接收是调用者提供值引用传递,是指方法接收是调用者提供变量地址以前学习C++时把参数传递分为值...

    java核心技术卷I里有一个结论我觉得挺有意思的:java中没有引用传递,只有值传递

    首先看定义:

    值传递,是指方法接收的是调用者提供的值

    引用传递,是指方法接收的是调用者提供的变量地址

    以前学习C++时把参数传递分为值传递和引用传递,国内的不少java教材愿意把对象的传递理解是引用传递,为什么它们会这么说呢?可以看下面一个例子:

    Java代码

    importjava.util.Calendar;

    publicclassChangeValue {

    publicstaticvoidmain(String[] args) {

    Calendar oc = Calendar.getInstance();

    System.out.println("origin:"+oc.getTime());

    changeDate(oc);

    System.out.println("after:"+oc.getTime());

    }

    staticvoidchangeDate(Calendar pd){

    pd.set(1970,1,1);

    }

    }import java.util.Calendar;

    public class ChangeValue {

    public static void main(String[] args) {

    Calendar oc = Calendar.getInstance();

    System.out.println("origin:"+oc.getTime());

    changeDate(oc);

    System.out.println("after:"+oc.getTime());

    }

    static void changeDate(Calendar pd){

    pd.set(1970, 1, 1);

    }

    }

    某时刻程序输出:

    origin:Thu Jan 05 21:15:59 CST 2012

    after:Sun Feb 01 21:15:59 CST 1970

    oc对象的值改变了,很多人就认为java对象传递实际上是引用传递。

    过程应该是这样的:

    运行changeDate这个函数时,方法得到的是对象引用的拷贝,oc和pd同时引用同一个对象,所以函数运行结束后,pd已经消失了,但是对引用对象的更改却也影响了oc所引用的同一对象,结合对之前的定义理解,这应该是值传递的过程(传递的是对象引用的拷贝)。

    以下附上另一个例子,两个对象的交换函数(C++中可以轻易实现):

    Java代码 25308473_1.gif 25308473_2.png

    25308473_3.gif

    publicclassSwap {

    publicstaticvoidmain(String[] args) {

    ObjectSample o1 =newObjectSample("hello");

    ObjectSample o2 =newObjectSample("你好");

    System.out.println("before swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());

    Swap.swapObject(o1, o2);

    System.out.println("after swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());

    }

    staticvoidswapObject(ObjectSample o1, ObjectSample o2){

    ObjectSample temp =newObjectSample("temp");

    temp = o1;

    o1 = o2;

    o2 = temp;

    }

    }

    classObjectSample{

    privateString title;

    ObjectSample(String title){

    this.title = title;

    }

    publicString getTitle(){

    returntitle;

    }

    }public class Swap {

    public static void main(String[] args) {

    ObjectSample o1 = new ObjectSample("hello");

    ObjectSample o2 = new ObjectSample("你好");

    System.out.println("before swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());

    Swap.swapObject(o1, o2);

    System.out.println("after swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());

    }

    static void swapObject(ObjectSample o1, ObjectSample o2){

    ObjectSample temp = new ObjectSample("temp");

    temp = o1;

    o1 = o2;

    o2 = temp;

    }

    }

    class ObjectSample{

    private String title;

    ObjectSample(String title){

    this.title = title;

    }

    public String getTitle(){

    return title;

    }

    }

    输出结果:

    before swap o1:hello o2:你好

    after swap o1:hello o2:你好

    java在交换程序中并没有交换两个对象的值,交换的是两个对象的拷贝,不能实现让对象参数引用一个新对象,究其原因还是因为java是采用了值传递而非引用传递。

    还有不少和以前自己接触的观点不一样的地方,当然需要借鉴的吸收并且经过自己的实践来辨别。

    展开全文
  • 前言当前主要存在两种传递...引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数进行的修改,将影响到实际参数或许存在这种误解,认为普通值类型就是值传递,引用类...

    前言

    当前主要存在两种传递方式,值传递和引用传递,先简单介绍值传递和引用传递

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

    引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数进行的修改,将影响到实际参数

    或许存在这种误解,认为普通值类型就是值传递,引用类型就是引用传递

    这种理解是错误的,《java编程思想》中提到过:”java程序设计语言总是采用值调用。也就是说,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。“

    正文

    在本节中我编写了几个程序来验证java的传递方式,实验中的参数类型也基本包括了经常出现的几种类型,有基本数据类型int,字符串str,int数组和自定义类。

    public class Main {

    private static void change(String str, int [] data, int count, Tag tag) {

    str = "new str";

    data[0] = 1;

    count = 10;

    tag.setAttr(88);

    }

    public static class Tag{

    private int attr;

    public Tag(int attr) {

    this.attr = attr;

    }

    public void setAttr(int attr) {

    this.attr = attr;

    }

    public int getAttr() {

    return this.attr;

    }

    }

    public static void main(String[] args) {

    String str = "str";

    int[] data = {0, 1, 2, 3};

    int count = 2;

    Tag tag = new Tag(8);

    change(str, data, count, tag);

    System.out.println(str); //没有变成new str

    System.out.println(data[0] + " " + data[1] + " " + data[2]); // 数组改变,{1,1,2,3}

    System.out.println(count);//没有改变

    System.out.println(tag.getAttr()); //值改变,变成88

    }

    }

    解析

    java在方法传参时会将原参数的一个拷贝传递到方法内部,并不是原参数,比如,count传递到方法中时是count的一个副本,在方法中修改count为10,是将count的副本修改成10,而count并没有被改变,还是原值

    字符串比较特殊,它的存储方式是这种方式

    26f823192f88

    字符串变量str赋值Data1

    当变量Str又赋值为New Data时,里面存储的就是0X2这个地址了

    26f823192f88

    image.png

    当方法参数是字符串时,它会将字符串地址的拷贝传递到方法内部,

    在方法内部,将字符串拷贝的地址重新指向了新的地址,修改的只是拷贝的存储的地址,但原字符串的地址并未改变,所以输出的值还是原来的值

    26f823192f88

    image.png

    int[] data是一个对象,同字符串类似,它会复制一个地址传到方法内部,在方法中,它修改了存储地址中的某个位置的值,而原参数也是指向了该地址,所以输出的数组值变了

    总结

    总结起来,java中参数传递情况如下:

    · 一个方法不能修改一个基本数据类型的参数

    · 一个方法可以修改一个对象参数的状态

    · 一个方法不能实现让对象参数引用一个新对象

    展开全文
  • 什么是参数的传递? 如果传递参数数据类型不匹配会怎么样? 参数传递传的是什么? 传值(ByVal) 传地址(ByRef,默认) 过程是什么? 执行一段相同的程序代码 有哪些过程? Sub Function ...

    目录

    过程是什么?

    什么是参数的传递?

    如果传递参数数据类型不匹配会怎么样?

    参数传递传的是什么?

    按地址传递(ByVal)

    按地址传递(ByRef,默认)


     

    过程是什么?

    执行一段相同的程序代码


    有哪些过程?

    Sub

    Function

    子程序

    函数

    Call语句调用

    Call语句调用

    没有返回值

    有返回值


    为什么要使用过程呢?有哪些好处?

    避免代码冗长,防止代码的仿佛书写。前面的博客中有说明,这里不做过多赘述


    Sub过程和Function过程分别的语法格式是怎样的?

    [Private|Public][Static] Sub <过程名> ([参数表])

              过程体

              [Exit Sub]

    End Sub

    [Private|Public|Static] Function 函数名([参数表] [AS类型])

          [函数体]

          [<函数名>=<表达式>]

          [Exit Function]

    End Function

    说明:

    过程必须遵守“先说明,后调用”的原则,声明过程就是编写一个能够实现预期功能的程序段,可被重复调用。

    过程名的命名规则与变量相同,过程名必须唯一,不得超过255个字符

    参数表是用来指明调用该Sub过程时需要传递给该过程的参数及类型,参数表内的参数又称形式参数(简称形参)。可以没有形参,也可以有一个或多个形参。

    形参的的命名规则与变量相同,形参具有数据类型,如果省略“AS 类型”不说明类型,默认为Variant型

    形参本身是一个名字,它是不占用内存空间的,只有在被函数调用了之后才参与运算、赋值,占用内存空间

    函数参数表中的参数,叫形参,调用函数时给的值,叫实参


     

    什么是参数的传递?

    调用过程时实参将参数值传递给相应的形参,然后在过程中实现对数据处理和返回结果的过程


    参数传递有哪些规则呢?

    个数相等、数据类型相容、顺序一致


    如果传递参数数据类型不匹配会怎么样?

    举例:如下代码中

    当程序运行时就会报错:

    原因:实参和形参的数据类型不匹配,

    说明:再定义的max过程中,形参m、n对应的为Integer(整型)的数据类型,他的范围是正整数、负整数或者0,

    而在调用max这个过程中,实参d、c在定义时的数据类型为Single(单精度型),范围为带有小数的实数,

    它们数据类型包含的范围不同,就好比,我要装一个大西瓜,你却给我一个小碗,那个小碗能放的下一个大西瓜吗?答案绝对是不可以的。


    参数传递传的是什么?

    可以传常量、变量、表达式计算的结果、数组。这就和接下来要讲的的传递方式有关了


    有哪几种传递方式?

    按地址传递(ByVal

    当调用时,系统将实参的值送给形参,形参接收到了值之后就断开了联系。在过程体内对形参的任何操作不会影响到实参

    如:我有一本书,通过小明借给了小李,小李实际拿到的是我书的复印本,不管小李怎么修改这本书,对我都是没有影响的

    实例:

    执行结果如图:


    按地址传递(ByRef,默认)

    当调用时,将实参的地址传递给形参,实参和形参共享存储单元,在过程体中对形参的任何操作都变成了相应实参的操作

    如:实参有一本书,把这本书给了形参,给的不是复印件,而是装这本书的房间钥匙,实参和形参都可以共享它,因为它们都有储存这本书的钥匙,有地址可以使用它,形参拿到这本书可以随意修改,修的就是原稿

    实例:

    '''''''''''''''''
    '输出X的值
    
    Private Sub Command1_Click()
        Dim x As Integer
        x = 6
        Call test(x)
        Print "    sub   ̺ x="; x
    End Sub
    
    
    
    Sub test(ByRef m As Integer)
        m = m + 5
    End Sub

    展开全文
  • 一、值传递传递的是基本数据类型 在方法调用中,实参会把它传递给形参,形参只是用实参值初始化一个临时存储单元,因此形参与实参虽然有着相同值,但是确实不同存储单元,因此对形参改变不会影响...

    场景:值传递和引用传递是应用在参数传递时

    一、值传递:传递的是基本数据类型

    在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个临时的存储单元,因此形参与实参虽然有着相同的值,但是确实不同的存储单元,因此对形参的改变不会影响实参的值

    package com.zejian.test;
    /**
     * java中的按值调用
     * @author zejian
     */
    public class CallByValue {
    	
    	private static int x=10;
    	
    	public static void updateValue(int value){
    		value = 3 * value;
    	}
    	
    	public static void main(String[] args) {
    		System.out.println("调用前x的值:"+x);
    		updateValue(x);
    		System.out.println("调用后x的值:"+x);
    	}
    	
    }
    

    二、引用传递

    传递的是对象(也可以看做是对象的地址),这时形参与实参的对象指向同一块存储单元,因此对形参的修改就会影响实参的值

    package com.zejian.test;
    /**
     * java中的按值调用
     * @author zejian
     */
    public class CallByValue {
    	private static User user=null;
    	public static void updateUser(User student){
    		student.setName("Lishen");
    		student.setAge(18);
    	}
    	
    	
    	public static void main(String[] args) {
    		user = new User("zhangsan",26);
    		System.out.println("调用前user的值:"+user.toString());
    		updateUser(user);
    		System.out.println("调用后user的值:"+user.toString());
    	}
    }
    

    展开全文
  • · spring mvc参数传递的方式有哪些? 一、前端向后台传递参数的方式: 通过 Servlet api 中的 HttpServletRequest对象 基本数据类型 + String类型 Array 数组 Java Bean 对象 List 集合 Map 集合 JSON 格式 二、...
  • 参数传递

    千次阅读 2018-12-01 07:30:18
    一、首先我们要知道有哪些数据类型。  一种是基本数据类型。就是我们熟悉 byte 、short、int、long、float、double、char、boolean 共八种。  另一种是引用数据类型。我们平时用关键字 class、interface、...
  • 参数传递及内存分析

    2016-07-23 18:10:53
    参数传递总结 要了解Java中的参数传递,首先需要了解在Java中基本数据类型有哪些?在Java中,基本的参数类型有8种: byte字节型8bit、short短整型16bit、int整型32bit、long长整型64bit、float浮点型单精度32...
  • JavaScript之参数传递

    2021-04-06 10:35:46
    Js基本数据类型有哪些?又是如果分类? 分为两类: 1.原始数据类型primitive type,有:Undefined、Null、Bollean、Number、String。 2.引用类型值,也就是对象类Object type,有:object、Array、Function、...
  • 接口:定义接口,interface接口里面就可以定义一个可以扩展功能,将来有哪些事物,想要具备这些功能,就可以来实现这个接口,然后重写这个功能。 接口不能创建对象。 FireInterface f=new FireInterface; //报错 ...
  • 在讲C#参数传递之前,我们先简单讨论下 c#中值类型和引用类型的定义以及区别,助于我们更好理解参数传递。 我们从内存角度来简单讨论下值类型和引用类型的区别。我们都知道值类型存储在栈上,引用类型分别在...
  • 在实际开发中也许我们...其中涉及哪些java知识点? 我们先弄明白什么是实参?什么是形参? ①public static void c(int b){ } ②int k=4;c(k); 在c(int b)中,b就是形参,形参就是形式参数,当你调用这个方法时,要传
  • 这次给大家带来怎么用Post方法传递json参数,用Post方法传递json参数的注意事项有哪些,下面就是实战案例,一起来看一下。本文主要介绍如何使用Angularjs $http服务以POST方法向服务器传递json对象数据。具体如下:...
  • 当一个变量为一个参数传入方法内部的时候,会两种不同的传递方式:值传递和引用传递。  值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值  引用传递的特点:方法内部对传...
  • 当一个变量最为一个参数传入方法内部的时候,会两种不同的传递方式:值传递和引用传递。值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值引用传递的特点:方法内部对传进去的...
  • 某个变量当作函数的参数...变量数据类型有哪些: 数字 字符串 布尔值 列表 元组 字典 空值 数据类型可变与不可变: &amp;gt; 可变类型:列表,元组,字典 不可变类型:数字,字符串, 其他...
  • 它是为在逻辑块之间传递参数的形参(Formal Parameter,形式参数)定义的数据类型。一、 参数类型TIMER、COUNTER、BLOCK的格式参数类型TIMER、COUNTER、BLOCK的长度均为2bytes,它们以二进制数字的形式存储在"字(Word)...
  • 在讲C#参数传递之前,我们先简单讨论下 c#中值类型和引用类型的定义以及区别,助于我们更好理解参数传递。 我们从内存角度来简单讨论下值类型和引用类型的区别。我们都知道值类型存储在栈上,引用类型分别在...
  • 主要是JAVA里除了8种基本类型参数是值传递,其他类对象传参数都是引用传递,我们时候不希望在方法里讲参数改变,这是就需要在类中复写clone方法。 2.getClass方法 final方法,获得运行时类型。 3.toString...
  • 主要是JAVA里除了8种基本类型参数是值传递,其他类对象传参数都是引用传递,我们时候不希望在方法里讲参数改变,这是就需要在类中复写clone方法。 2.getClass方法 final方法,获得运行时类型。 3.toS...
  • c++中const作用有哪些

    千次阅读 2018-07-28 16:31:15
    1、定义常量 const定义常量编译器可以对其进行数据静态类型安全检查。... //fun函数产生A类型的临时变量用于复制参数a,临时变量构造、复制、析构过程都将产生时间损耗。 void fun(A const &am...
  • 2.参数形参:形式上一种参数实参:实际上的参数在调用方法时候,将实参传递给形参,实际上就是赋值操作注意:方法中的参数可以是java中任何类型形参和实参关系(1)类型要一致,最好一致,可以将小类型的的...
  • 主要是JAVA里除了8种基本类型参数是值传递,其他类对象传参数都是引用传递,我们时候不希望在方法里讲参数改变,这是就需要在类中复写clone方法。2.getClass方法final方法,获得运行时类型。3.toString方法...
  • 线程开启需要占用资源有哪些

    千次阅读 2020-05-17 15:45:26
    一、线程开启所占用空间开销 【1】Thread内核数据占用:主要OSID(线程ID)和Context(存放...【3】用户堆栈模式(主要部分):用户程序中局部变量和参数传递所使用堆栈,如果是引用类型则使用堆空间,如
  • 大约如下几种: ...IllegalArgumentException- 传递非法参数异常 ArithmeticException - 算术运算异常 ArrayStoreException - 向数组中存放与声明类型不兼容对象异常 IndexOutOfBoundsExc...
  • 主要是JAVA里除了8种基本类型参数是值传递,其他类对象传参数都是引用传递,我们时候不希望在方法里讲参数改变,这是就需要在类中复写clone方法。2.getClass方法final方法,获得运行时类型。3.toString方法...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 285
精华内容 114
关键字:

参数的传递有哪些类型