精华内容
下载资源
问答
  • 程序设计语言中将参数传递给方法的几种方式:按名调用(call by name): Algol 语言采用此方式, 已成为历史;按值调用(call by value): 方法接收到的是调用者提供的 变量值;按引用调用(call by reference): 方法接受到的...

    程序设计语言中将参数传递给方法的几种方式:

    按名调用(call by name): Algol 语言采用此方式, 已成为历史;

    按值调用(call by value): 方法接收到的是调用者提供的 变量值;

    按引用调用(call by reference): 方法接受到的是调用者低筒的 变量地址;

    C++ 支持 按值调用 和 按引用调用:

    void func(int arg); // 按值调用;

    void func(int& arg); // 按引用调用;

    而 java 只支持 按值调用, 也就是说方法得到的是所有参数值的一个拷贝, 在方法内对参数值进行修改是不会影响原值的.

    然而方法参数有两种类型:

    基本数据类型: 数字, 布尔值;

    对象引用.

    当方法参数是 对象引用 时, 在方法很容易的调用其 setXXX 方法修改该对象属性值, 在退出方法后该修改仍然有效, 但这仍旧只是 按值调用.

    因为参数是 对象引用, 在该方法内仍旧执行原对象(类似 C++ 的指针), 调用它的 setXXX 方法当然能修改对象属性了. 但也仅限于修改对象属性(状态), 而不能通过 new 等方式对原对象进行修改.

    如果还有疑问, 就请看看这个例子:

    class MyObject {

    private String name;

    MyObject(String name) {

    this.name = name;

    }

    }

    static void swap(MyObject first, MyObject second) {

    MyObject temp = first;

    first = second;

    second = first;

    }

    static void testSwap() {

    MyObject a = new MyObject("a");

    MyObject b = new MyObject("b");

    swap(a, b);

    }

    请问在执行 swap() 函数后, 对象 a 和 对象 b 的 name 是否变化?

    答案是没有变化. 在 testSwap() 方法中, first 和 second 完成交换并分别指向对方. 但是, 在进入方法时, 它们拿到的是对象引用的拷贝(位置), 类似于:

    进入 swap() 方法前, a 知道在内存地址为 100 的地方存储了一个 MyObject 对象, 'b' 知道在内存地址为 200 的地方存储了另一个 MyObject 对象;

    进入 swap() 方法时, a 将它的对象引用复制一份给 first, 也就是说 first 知道内存地址为 100 的地方有一个 MyObject 对象. second 同理;

    在退出 swap() 方法时, first 与 second 交换值, 也就是说 first 知道内存地址为 200 的地方有一个 MyObject 对象, 它已经跟内存地址为 100 的 MyObject 对象没有任何关系了. second 同理;

    在退出 swap() 方法后, first 与 second 被销毁, a 仍旧是知道内存地址为 100 的地方有一个 MyObject 对象...

    其实, 这就是 C/C++ 的指针.

    顺便说一句, 通过 C++ 的 按引用调用 可以很方便实现 swap() 函数. 当然, 用指针也是支持滴, 只不过稍微复杂点(这里只给出声明, 有兴趣的同学自己去写实现吧):

    MyObject* a = new MyObject("a");

    MyObject* b = new MyObject("b");

    void swap(MyObject& first, MyObject& second); // C++ 引用

    void swap(MyObject **first, MyObject **second); // C/C++ 指针版 swap

    综上, java 中的方法参数:

    不能修改一个基本数据类型的参数(即数值型或布尔型);

    可以改变一个对象参数的状态;

    不能让对象参数引用一个新的对象.

    展开全文
  • Java 方法传参

    2017-09-19 11:08:48
    java程序设计语言总是采用值传递进行调用,无论是基本数据类型还是对象 由以下实例代码即可证明:public static void main(String[] args) { Employee a = new Employee("a", 1000, new Date()); Employee b = new...

    java程序设计语言总是采用值传递进行调用,无论是基本数据类型还是对象
    由以下实例代码即可证明:

    public static void main(String[] args) {
    
        Employee a = new Employee("a", 1000, new Date());
        Employee b = new Employee("b", 3000, new Date());
    
        System.out.println("a: " + a); 
        // a: Employee [name=a, salary=1000.0, hireDay=Wed Sep 06 13:49:43 CST 2017, id=0]
        System.out.println("b: " + b); 
        // b: Employee [name=b, salary=3000.0, hireDay=Wed Sep 06 13:49:43 CST 2017, id=0]
    
        swap(a, b);
    
        System.out.println("a: " + a);
        // a: Employee [name=a, salary=1000.0, hireDay=Wed Sep 06 13:49:43 CST
        System.out.println("b: " + b);
        // b: Employee [name=b, salary=3000.0, hireDay=Wed Sep 06 13:49:43 CST  
    
        }
    public static void swap(Employee a, Employee b) {
        Employee temp = a;
        a = b;
        b = temp;
    }
    

    由此可以得出java中方法参数使用的情况:
    - 一个方法不能修改一个基本数据类型参数的值(值传递,只是对该参数的拷贝)
    - 一个方法可以改变对象参数(即引用类型参数)的状态(对象的实例变量的值是可以在方法中改变的)
    - 一个方法不能让对象参数引用一个新的对象(java传参采用按值传递,对象类型参数传递时是对其引用的拷贝,而不是对象本身)

    展开全文
  • 展开全部1、使用Map jdbcTemplate.queryForMap查询,其返回结果e5a48de588b63231313335323631343130323136353331333431356638必须有且只有1个map值,否则会抛出异常。若抛出异常,则肯定不会得到返回值。...

    展开全部

    1、使用Map   jdbcTemplate.queryForMap查询,其返回结果e5a48de588b63231313335323631343130323136353331333431356638必须有且只有1个map值,否则会抛出异常。若抛出异常,则肯定不会得到返回值。

    例如“控制台提示错误Incorrect result size: expected 1, actual 0”。

    问题原因参考(1)字符串的Jdbctemplate查询:EmptyResultDataAccessException:结果大小不正确:预期1,实际0网页链接

    问题原因参考(2)JdbcTemplate queryForObject结果大小不正确:预期为1,实际为0网页链接

    2、推荐使用jdbcTemplate.query或List> jdbcTemplate.queryForList查询。/**

    *

    * @Title: querySpxxMap_dbBySsflbm

    * @Description: TODO(根据税收分类编码、企业id,联查商品信息表、税收分类编码表的,商品id+商品名称+规格型号+计量单位+税率+税收分类编码)

    * @param ssflbm

    * @param qyid

    * @return    设定文件

    * @return Map    返回类型

    * @throws

    */

    public List> querySpxxMap_dbBySsflbm(String ssflbm, String qyid) {

    String sql="select spxx.id,spxx.spmc,spxx.ggxh ,spxx.jldw,ss.slv ,ss.hbbm ssflbm "

    + "from t_jc_ssflbm ss "

    + "left join t_qy_spxx  spxx on spxx.ssflbm=ss.hbbm  "

    + "where ss.hbbm=? and spxx.qyid=?";

    //queryForList  参数写法1

    List conditionList = new ArrayList();

    conditionList.add(ssflbm);

    conditionList.add(qyid);

    List> list1=jdbcTemplate.queryForList(sql,conditionList.toArray());

    //queryForList  参数写法2

    List> list2=jdbcTemplate.queryForList(sql,new Object[] {ssflbm,qyid});

    return list1;

    }

    展开全文
  • JAVA传参和引用传参

    千次阅读 2013-08-01 11:33:25
    当然,我在这里只是就我自己对Java和其他语言的一些认识谈谈自己的理解和看法。  首先,我们要明确下面这两条不可争论的事实了:  【1】、对象是传引用的  【2】、基本类型是传值的  我对这个问题是这样理解...
    这是个老生常谈的问题了,经过了先辈们无数的争论,但是还是没有提出一个令所有人满意的答案。当然,我在这里只是就我自己对Java和其他语言的一些认识谈谈自己的理解和看法。 
    首先,我们要明确下面这两条不可争论的事实了: 
    【1】、对象是传引用的 
    【2】、基本类型是传值的
     
    我对这个问题是这样理解的: 
    有过C++背景的朋友可能都会有一个认识,因为C/C++传参有很多种选择,直接传递对象或值,或者传递指针,传递引用等。而大家都有个共识,那就是在传递基本数据类型时,选择第一种,而传递对象的时候则选用传指针或者引用。这点可以从数据传输效率的角度上得到解释。 
    而Java创始人James在某些方面还是得借鉴一些C的思想的,所以上述两条就比较好理解了。 
    个人对传参的理解是: 
    函数参数相对其他字段,在编译器里肯定会有特殊处理的,而一般的编译器则是这样处理: 
    在运行栈中拷贝一份传递过来的参数(值参),而后面函数体的关于值参的操作实际上都是针对运行栈里保存的备份操作的。可以用这种理解验证一下C++的三种情况。例如传递过来的是引用,则编译器的处理流程是这样的: 
    首先拷贝传递来的值参(注意:值参也是引用,Java里new之后获得的都是对象的引用,而不是对象本身,这点和c++很不同),然后将其压入运行栈,后面的操作也就是对这份拷贝(也是对预期的对象的引用,所以可以到达对象)操作了。 

    我们看看以下的几个例子来增加对上述思想的理解。 

    Example1: 
    Java代码  收藏代码
    1. package com.shansun.ref;  
    2.   
    3. public class RefInteger {  
    4.   
    5.     public RefInteger() {  
    6.     }  
    7.   
    8.     public void swap(Integer para1, Integer para2) {  
    9.         Integer tmp;  
    10.         tmp = para1;  
    11.         para1 = para2;  
    12.         para2 = tmp;  
    13.     }  
    14.   
    15.     public void print(int int1, int int2) {  
    16.         System.out.println("Int1 is " + int1);  
    17.         System.out.println("Int2 is " + int2);  
    18.     }  
    19.   
    20.     public static void main(String[] args) {  
    21.         Integer int1 = new Integer(10);  
    22.         Integer int2 = new Integer(50);  
    23.   
    24.         RefInteger ref = new RefInteger();  
    25.         System.out.println("---------SWAP UNABLE----------");  
    26.         ref.swap(int1, int2);  
    27.         ref.print(int1, int2);  
    28.     }  
    29. }  

    运行结果: 
    ---------SWAP UNABLE---------- 
    Int1 is 10 
    Int2 is 50 

    我们都知道一点:void swap(int, int)是不能达到交换两个参数的值的。我们这里试试使用Integer对象呢?同样也交换失败,原因很简单:void swap(Integer para1, Integer para2)函数传递进来的是两个类型为Integer类的引用,而在函数体里实现的功能只是改变了para1和para2引用的对象,而para1和para2在内存中的值却一点变化都没有。可能这样理解更加形象一点: 
    例如,A省省长是小王,B省省长是小张,这样牵强的理解为小王是A省的一个引用,小张则是B省的一个引用。在执行swap(小王,小张)后,产生的效果只是:现在A省省长是小张,B省省长是小王了,即现在小张代表的不再是B省,而是A省了,而对于对象本身,如A省,其地理位置,人口数量等都没有变化。不能说在swap语句执行后,A省跑到地图上B省的位置去了吧? 

    Example2: 
    Java代码  收藏代码
    1. package com.shansun.ref;  
    2.   
    3. public class RefObject {  
    4.   
    5.     int val;  
    6.   
    7.     public RefObject(int val) {  
    8.         this.val = val;  
    9.     }  
    10.   
    11.     public void setVal(int val) {  
    12.         this.val = val;  
    13.     }  
    14.   
    15.     public int getVal() {  
    16.         return this.val;  
    17.     }  
    18.   
    19.     public void print() {  
    20.         System.out.println("Now val is " + val);  
    21.     }  
    22.   
    23.     public static void swap(RefObject obj1, RefObject obj2) {  
    24.         RefObject tmp;  
    25.         tmp = obj1;  
    26.         obj1 = obj2;  
    27.         obj2 = tmp;  
    28.     }  
    29.   
    30.     public static void swapx(RefObject obj1, RefObject obj2) {  
    31.         int tmp;  
    32.         tmp = obj1.getVal();  
    33.         obj1.setVal(obj2.getVal());  
    34.         obj2.setVal(tmp);  
    35.     }  
    36.   
    37.     public static void main(String[] args) {  
    38.         RefObject obj1 = new RefObject(10);  
    39.         RefObject obj2 = new RefObject(50);  
    40.         obj1.print();  
    41.         obj2.print();  
    42.         swap(obj1, obj2);  
    43.         obj1.print();  
    44.         obj2.print();  
    45.         swapx(obj1, obj2);  
    46.         obj1.print();  
    47.         obj2.print();  
    48.     }  
    49. }  

    执行结果: 
    ---------SWAP UNABLE---------- 
    Int1 is 10 
    Int2 is 50 
    ---------BEFORE SWAP---------- 
    Int1 is 20 
    Int2 is 30 
    ---------SWAP ENABLE---------- 
    Int1 is 30 
    Int2 is 20 

    首先和上面例子一样,swap(obj1, obj2)也是换汤不换药的,所以交换失败。但是swapx则交换数据成功了,我们还拿上面省长的例子来解释这个现象: 
    国家要求小王代表的A省的C市市长和小张代表的B省的D市市长交换职位,可以吗?当然可以了,所以交换成功。 

    我们最后再回到Example1的问题,如果我就想交换两个int值呢?其实也不是没有办法的。 
    Java代码  收藏代码
    1. package com.shansun.ref;  
    2.   
    3. public class RefInteger {  
    4.   
    5.     int int1, int2;  
    6.   
    7.     public RefInteger(int int1, int int2) {  
    8.         this.int1 = int1;  
    9.         this.int2 = int2;  
    10.     }  
    11.   
    12.     public void swap() {  
    13.         int tmp;  
    14.         tmp = int1;  
    15.         int1 = int2;  
    16.         int2 = tmp;  
    17.     }  
    18.   
    19.     public void print() {  
    20.         System.out.println("Int1 is " + int1);  
    21.         System.out.println("Int2 is " + int2);  
    22.     }  
    23.   
    24.     public static void main(String[] args) {  
    25.         RefInteger ref = new RefInteger(2030);  
    26.         System.out.println("---------BEFORE SWAP----------");  
    27.         ref.print();  
    28.         System.out.println("---------SWAP ENABLE----------");  
    29.         ref.swap();  
    30.         ref.print();  
    31.     }  
    32. }  


    执行结果: 
    ---------BEFORE SWAP---------- 
    Int1 is 20 
    Int2 is 30 
    ---------SWAP ENABLE---------- 
    Int1 is 30 
    Int2 is 20 

    小记: 
    C++:使用分界符&标示引用 
    C#: 使用ref关键字标示引用 

    好了,关于传参的问题我的理解就是这样的。如有错误,敬请指出。 
    展开全文
  • 当然,我在这里只是就我自己对Java和其他语言的一些认识谈谈自己的理解和看法。 首先,我们要明确下面这两条不可争论的事实了: [b]【1】、对象是传引用的 【2】、基本类型是传值的[/b] 我对这个问题是这样理解...
  • Java 方法传参方式: 按值调用

    千次阅读 2016-11-07 09:03:04
    Java 2016-11-01 22:20 程序设计语言中将参数传递给方法的几种方式: 按名调用(call by name) : Algol 语言采用此方式, 已成为历史; 按值调用(call by value) : 方法接收到的是调用者提供的 变量值 ; 按引用...
  • 前言最近一年多的时间陆续接触了一些对我来说陌生的语言,主要就是 Python 和 Go,期间为了快速实现需求只是...Java基本类型传递先拿我最熟悉的 Java 来说,我相信应该没人会写这样的代码:@Testpublic void testBa...
  • 程序设计语言中将参数传递给方法的几种方式: 按名调用(call by name): Algol 语言采用此方式, 已成为历史; 按值调用(call by value): 方法接收到的是调用者提供的 变量值; 按引用调用(call by reference): 方法接受...
  • 比较以上两种格式,发现格式不对.传给后台时,总是报参数错误的异常. 解决办法:定义一个对象继承自okhttp3.RequestBody public class DefaultRequestBody extends ...了解更多内容,请关注职坐标编程语言JAVA频道!
  • 本文主要梳理了几种语言传参机制,即关于 传值、传引用 之争最近开始学node.js搭后端服务器时,碰到这样一句话 java只有一种传参机制就是传值javascript其大部分语法规范取自于JAVA语法规范, 那么这种句话也适用于...
  • import java.io.*;import java.lang.*;class test3{public static void main(String []args) throws IOException{long a = System.currentTimeMillis();Process process = Runtime.getRuntime().exec("/home/zhangdi...
  • 越南式三明治1.... commandArgs()传参:测试脚本test.R:args print(args[1])print(args[2])Rscript test.RHello R输出为:[1]"Hello"[2]"R"3. getopt传参:install.packages("getopt")library("ge...
  • Java的方法传参

    2021-03-19 15:20:30
    Java程序设计语言总是采用按值调用。 对于基本类型的变量是直接传值,而对于引用类型的变量则会传的是这个对象的地址。 Java总是按值调用,所以,对于str,student则是拿的它们的值,而这个值为实例对象的首地址。 ...
  • **首先:需要俩jar包,可以在我个人...import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import org.apache.http.HttpEntity;import org....
  • Java的官方文档【3】 中如此描述:“When the method or constructor is invoked, the values of the actual argument expressions initialize newly created parameter variables.”但是作为面向对象的语言,...
  • 许多不同意我的读者用 C++ 语言作为例子。因此,在此栏目中我将使用 C++ 和 Java 应用程序进一步阐明一些事实。  要点  读完所有的评论以后,问题终于明白了,考试吧提示: 至少在一个主要问题上产生了混淆。因为...
  • Java语言后台实现调用url路径并传参

    千次阅读 2016-09-06 15:18:36
    **首先:需要俩jar包,可以在我个人资源库里...import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.http.HttpEntity;...
  • Java 语言的参数传递只有值传递。当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会...
  • java传参方式--值传递还是引用传递  参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。写它是为了揭穿普遍存在的一种神话,即认为 Java 应用程序按引用传递参数,以避免...
  • Java调用exe并传参

    2020-05-19 11:59:10
    文章目录问题来源解决思路测试结果完整代码JavaCodeexe源语言(c++)代码 问题来源 最近遇到一个课设,需要用编译原理的知识写一个sql解释器; 整个项目用的是SpringBoot框架,但是不能愉快的白嫖MySql了, 既然需要...
  • 上一期是对java的分支结构进行讲解... 这一期是对方法method的介绍,它也被称之为函数,它的基本格式为:方法的修饰符 方法的返回值 方法的名字 ( 参数列表 ) { 代码/方法体 }1、方法1.1 概述Java语言中的“方法”(...
  • java–关于值传参和引用传参 java作为面向对象的编程语言,其语法其实和C差不多 相信作为编程初学者,对于写一个交换两个变量的值的函数应该遇到过该问题 c值传递和指针传递: #include void swap(int a,int...
  • JAVA基础--方法传参为啥拿这个当话题?在初学者阶段,许多童鞋都对方法传参比较迷茫,知其然不知其所以然。一.先说说参数传递的几个术语:值调用(call by vale):表示方法接收的是...**JAVA语言总是采用值调用。也...
  • JAVA基础--方法传参为啥拿这个当话题?在初学者阶段,许多童鞋都对方法传参比较迷茫,知其然不知其所以然。一.先说说参数传递的几个术语:值调用(call by vale):表示方法接收的是...**JAVA语言总是采用值调用。也...
  • 本文主要梳理了几种语言传参机制,即关于 传值、传引用 之争 最近开始学node.js搭后端服务器时,碰到这样一句话 java只有一种传参机制就是传值 javascript其大部分语法规范取自于JAVA语法规范, 那么这种句话也...
  • 我是Groovy的新手,所以我对该语言的运行时绑定,类型化和非类型化属性感到困惑 . 我个人更喜欢声明类型 .但是,我有一个问题 .我有一个小方法,从 Map ,输入,等等,我知道数字的变量 . 假设我不知道初始类型是...
  • Java是半编译半解释型语言,其执行过程如下: Java源文件:以*.java结尾的文件,用来保存原始Java代码。 编译过程: 经命令 javac 主类名.java(出现中文时命令为 javac -encoding UTF-8 主类名.java) 生成 ...
  • 课程通过部门表,员工表,账号表结合...项目开发语言java,jsp,mysql,MyBatis项目运行环境:jdk1.7及以上版本,tomcat6.0及以上版本,mysql5.5及以上版本项目开发工具: 本项目开发工具是MyEclipse6.5,也支持myeclips...
  • 本文将简单的介绍linux下使用python,go,c,java四种不同语言连接postgresql数据库的方法,顺便将会有简单的创建表和插入数据的实例。 C连接postgresql数据库 安装libpqxx C连接postgrsql数据库需要下载...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 218
精华内容 87
关键字:

java语言传参

java 订阅