首先,在java中没有C语言的指针概念,但是对象传递默认就是引用。
如:
Person person = new Person(1,"name",23);//初始化一个person
Person me = person;//新建一个Person对象me,并以person初始化
me.setAge(18);//修改me的年龄为18
//结果:person的年龄‘也’修改为18
这个性质可以很方便的继承C、C++的编程习惯,参数传递不用返回,因为调用某方法的时候的返回参数是有限的,而且返回对象实在是不科学。
那么就可以放心的把返回参数用来标记方法的执行结果[如,成功或者失败],参数就让传入的对象来默认接收方法的执行效果。
举例:
/**
* @param file
* @return 初始化文件信息,获取KEY,创建文件缓存区域
*/
public String initFile(KAOSHI_FILE file, String name, String ext) {
String path = BASE_PATH + "KAOSHI_ZIP";
// + name.substring(0, name.indexOf('_'));
exsit = false;
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();// 创建目录
}
File f = new File(path+"/" + name + ext);
if(f.exists())
exsit = true;
try {// FINAL.DIR+PictureFile
file.setFile(new FileOutputStream(new File(path+"/" + name + ext)));
file.setKey(Encrypt.GetNewKey(new byte[256]));
} catch (FileNotFoundException g) {
g.printStackTrace();
return null;
}
file.setPath(path + name + ext);
return path+"/" + name + ext;
}
这里是我的一片段代码,KAOSHI_FILE 对象中有一个成员是OutputStream,此处是用于初始化其输出文件。此方法的返回值就可以用于标示方法的执行情况,比如返回是否成功创建文件,此处就简单的返回文件路径,因为KAOSHI_FILE中没有存储文件路径的成员。此处仅仅是举例,代码质量请忽略。
方法成功执行后,调用方法时传入的file对象此时就已经初始化了其OutputStream成员。
在java中,对象的传递都是引用,基础类型的复制、复制和传参就不是了。基础数据类型:int,float,double,long,byte,short,boolean.
比如:
int old = 123;
int new_ = old;
new_ ++;
new_的修改与old无关,int是基础类型数据。
List,是对象,所以其传递也和基础对象一样,引用。
但是,此处还有一个注意点,因为List个容器,而且是个对象容器,那么此处就会有值得注意了。
通过以上的描述,那么以下代码片段很显然:
List<Person> persons = PersonService.getPersonsByAgeIn(18,23);//初始化一个Person的List。
List<Person> backPersons = persons;
显然,对backPersons的操作会直接改变persons的数据。
backPersons只是定义了一个数据引用,并没有初始化申请空间。现在的backPersons就是persons。
那么,换以下方式呢?
List<Person> persons = PersonService.getPersonsByAgeIn(18,23);//初始化一个Person的List。
List<Person> backPersons = new ArrayList<Person>();
backPersons.addAll(persons);
这样给backPerson赋值之后再操作内部数据,此处分两种情况,如果对backPersons的操作是在List层的操作,对persons没有影响。也就是说,如果backPersons只是对内部数据做了简单的删除、排序或者添加等操作。但是,如果操作深入到List内部数据层,那么backPersons数据修改就会影响到persons的数据。
原因很简单,
backPersons已经new了空间,然后在addAll的时候,为每一个persons的数据都new了一个空间,然后给backPersons插入数据。
所以,对backPersons只是对内部数据做了简单的删除、排序或者添加等操作是不会影响persons的数据。
但是,在给backPersons插入数据的时候,并没有重新为其内部数据对象new新的数据空间,也就是说,backPersons中的每一个Person都是persons一样的Person。
那么,操作的时候就会想回影响。