java中如何实现传入参数并修改参数本体的值
标题的意思是在java的方法中,传入一个参数并修改它,在方法体外的这个参数同时也会被修改,就相当于C语言里函数的参数列表是指针而不是普通的数据类型。java中没有指针,但是有类似指针的数据类型,就是引用类型。
引用类型
java中的引用类型有数组,对象和接口。
数组
对于下面这段代码,就实现了传入数组,经方法修改后方法体外的数组也被修改。
public class test{
public static void main(String args[]){
char []s = {'a','a','a'};
System.out.print("修改前:");
for(int i=0; i<s.length; i++){
System.out.print(s[i]);
}
System.out.println();
A.fun(s);
System.out.print("修改后:");
for(int i=0; i<s.length; i++){
System.out.print(s[i]);
}
System.out.println();
}
}
class A{
static void fun(char []s){
for(int i=0; i<s.length; i++){
s[i]='b';
}
}
}
对象
其实我起初一直坚信没有指针后java想要修改传递的值会很不方便,还要专门创建对象,多麻烦。但事实证明我还是太年轻了。
我在这之前曾经有一个想法,int不是对应Integer类吗,char不是对应Character类吗?那么我为什么不可以通过这种基本数据类型的封装类来创建对象,这不就实现了基本数据类型的修改吗?想到这里我甚至觉得自己是个天才,但很快代码测试就打了我的脸。
public class test{
public static void main(String args[]){
Integer a = 666;
System.out.println("修改前:a="+a);
A.fun(a);
System.out.print("修改后:a="+a);
}
}
class A{
static void fun(Integer a){
a=999;
}
}
看来这种“天才”的想法行不通。
大丈夫能屈能伸,咱换条路。
public class test{
public static void main(String args[]){
Number num = new Number();
System.out.println("修改前:num="+num.integer+"."+num.fraction+ "长度为"+num.len);
A.fun(num);
System.out.println("修改后:num="+num.integer+"."+num.fraction+ "长度为"+num.len);
}
}
class Number{
int integer = 0;
int fraction = 0;
int len = 0;
}
class A{
static void fun(Number num){
num.integer = 123;
num.fraction = 456;
num.len = 6;
}
}
我之前算是没有领会到java的对象思想,对象即意味着封装,数据不在是孤立的,而是共同属于一个对象,这样可以更方便的管理数据,同时也符合人类的思维模式。拿上面这段代码为例,创建一个Number类,Number类有integer、fraction和len三个成员变量,基本上满足了一个数的基本属性,以这个类创建的num对象传入到方法之后,便可通过成员运算符修改对象的成员变量,这样也挺方便的。
接口
接口比较特殊,接口可以简单理解成一种特殊的类(实际上并不是类)。我们知道类是由变量和方法组成的,接口中的变量会被隐式的指定为 public static final 变量,而接口中的方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract,final变量实际上就是常量,而abstract方法也没有具体的方法体,所以说传入一个接口类型的变量是没什么好修改的,故这种引用类型的引用传递一般来说不考虑。