Java方法 传值方式

这个问题是面试的时候经常会问到的一道题吧?这次做项目的过程中,其中一个同学因为无用了,导致了一个bug,不过是在提测前啦!本来我想借着这次机会分享一下java方法传参的机制,但是经过几天的学习,了解,发现网上的博客基本上没有一篇能让人看后就清清楚楚的明白的,讲的都很囫囵吞枣。觉得要要真正把这个问题说明白还真的不是一件容易的事?要了解jvm的堆栈和堆,以及java中的引用和赋值的含义。我现在也不能清楚的讲明白,但现在应该不会误用了,就是方法调用,知道怎样做可以改变传递参数的值,怎样做是不会改变传递参数的值。下面来个小测试程序,你知道这个程序会答应出什么吗?

public class Test {
    public static void main(String[] args) {
        StringBuffer a = new StringBuffer("A");
        StringBuffer b = new StringBuffer("B");
        int i = 5;
        operate(a, b, i);
        System.out.println(a + "," + b + "," + i);
    }
    public static void operate(StringBuffer x, StringBuffer y, int j) {
        x.append(y);
        y = x;
        y.append("C");
        j = 1;
    }
}

规律总结:

Java参数,不管是原始类型还是引用类型,传递的都是副本

如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.

如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是通过地址改变改变了地址指向的值,那么在函数内的改变会影响到传入的参数。

如果在函数中改变了副本的地址,如当执行如a=其他对象,a=new等赋值操作时,实际上是将a指向新的位置,那么函数外的原值不改变。

时间: 2024-10-27 08:27:10

Java方法 传值方式的相关文章

一道 Java 方法传值面试题——Java方法传值的值传递概念和效果 + Integer 缓存机制 + 反射修改 private final 域

原题代码如下: 1 public void test1() { 2 int a = 1, b = 2; 3 System.out.println("before: a=" + a + ", b=" + b); 4 swap1(a, b); 5 System.out.println("after: a=" + a + ", b=" + b); 6 } 7 8 private void swap1(int i1, int i2)

【java】的传值方式

[java]的传值方式 当你问大多数程序员Java是传值还是传引用的时候,你可能会得到两种答案之一: (1)Java传递原始类型数据时使用的是传值方式:传递对象时则使用传引用方式:String类型的数据采用的是传值方式,因为字符串是不可变的.(2)Java传递所有参数都使用传值方式. 只有第二个答案是正确的.理解传值和传引用的区别的关键是要记住,当你向一个方法传递一个对象时,Java没有把对象放入堆栈,它只是拷贝对象的引用然后将这个引用的拷贝放入堆栈.也就是说,根据定义,Java使用的是传值方式

Java 向main方法传值时关于*号的问题

现有要求如下: 通过cmd的方式,求简单表达式的值. 比如输入 java Expression 3 + 4 得到的结果为:7 代码: import java.text.DecimalFormat; public class Expression { public static void main(String[] args) throws Exception { if(args == null || args.length != 3){ //MyException只是简单的继承Exception

类的私有属性及私方法(请注意属性的传值方式)

# -*- coding: utf-8 -*- #python 27 #xiaodeng #http://blog.csdn.net/wklken/article/details/6313265 #类的私有属性及私方法(请注意属性的传值方式) class MyClass(): def __init__(self): #定义私有属性,且直接给属性赋值,请记住传值方式 self.__name='xiaodeng' self.age=28 def printName(self): return sel

React事件方法、React定义方法的几种方式、获取数据、改变数据、执行方法传值

1.案例实现代码如下 import React, { Component } from 'react'; /** * 特别注意this,对于传值和绑定都十分重要 */ class Home4 extends Component{ constructor(props){ super(props); //定义数据 this.state={ msg:'这是一个Home4组件', name:"杨杰" } this.getMessage = this.getMessage.bind(this);

Spring MVC 传值方式总结

前端传到Controller: 方法1 通过HttpServletRequest .写法如下: @Controller public class MyTestController { @RequestMapping("/print") public String PrintInfo(HttpServletRequest request) { System.out.println("name:" +request.getParameter("name&quo

java中传值及引伸深度克隆的思考(说白了Java只能传递对象指针)

java中传值及引伸深度克隆的思考 大家都知道java中没有指针.难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址的话简直不可想象! java中内存的分配方式有两种,一种是在堆中分配,一种是在堆栈中分配,所有new出来的对象都是在堆中分配的,函数中参数的传递是在栈中分配的.通常情况下堆的内存可以很大,比如32位操作系统中的虚拟内存都可以被堆所使用(当内存紧张的时候甚至硬盘都可以是堆的存储空间),而堆栈的内存分配是有限的. 这和c++中内存分配差不多(c++中还要有另一种方式用于全

Struts2的传值方式及原理

1.普通的传值方式 UserActionForCommonParam类 Action类接收三个参数,分别是id,username,content. package com.struts.action; public class UserActionForCommonParam { private int id; private String username; private String content; public int getId() { return id; } public voi

java方法参数传递面试题

传值还是传引用是Java中很基础的一个问题,也是笔试的时候经常被考察的一个问题,总结一下. 题目1: 写出以下程序的输出内容. public class Test { public static void changeValue(int value){ value = 0; } public static void main(String[] args) { int value = 2010; changeValue(value); System.out.println(value); } }