传值与引用
不管Java参数的类型是什么,一律传递的是参数的副本 (来自:《Java程序员面试宝典》)
如果Java是传值,那么传递的是值的副本;如果Java是传引用,那么传递的是引用的副本(来自:《Thinking in java》)
在Java中,变量分为两类:基本数据类型和引用数据类型
- 对应基本的数据类型,Java是传值的副本
- 对于引用数据类型,Java是传引用的副本,传引用的副本实质就是复制指向地址的指针
对于传递引用的副本,可以这么理解:
一个仓库,有一把钥匙,负责人A持有,那么有一天,负责人A不在家,B恰好要来调研,那么A就事先复制了一把钥匙寄给了B,那么B就可以对仓库进行操作了,但是B使用完要上交,所以B使用的钥匙有时效性
Example Ⅰ
public static void main(String[] args) {
boolean test = true;
System.out.println("Before test(boolean) : test " + test);
test(test);
System.out.println("After test(boolean) : " + test);
}
public static void test(boolean test) {
test = !test;
System.out.println("In Test(boolean) : test = " + test);
}
//Before test(boolean) : test true
//In Test(boolean) : test = false
//After test(boolean) : true
当我们把值传到test方法中,实际上是传入的一个副本,当我们方法结束后,这个副本被销毁,所以我们的main方法的值不变
Example Ⅱ
public static void main(String[] args) {
StringBuffer string = new StringBuffer("Hello");
test(string);
System.out.println(string);
}
public static void test(StringBuffer str){
str.append(", World !");
}
//Hello, World !
在这里,String是一个引用,Java对于引用形式传递对象类型的变量时,实际上是将引用作为一个副本传进方法函数的,这个副本指向的是对象的地址。通过引用副本(复制的钥匙)找到地址(仓库)并修改地址的值,也就修改了对象
Example Ⅲ
public static void main(String[] args) {
String string = "Hello";
test(string);
System.out.println(string);
}
public static void test(String str) {
str = "World";
}
//Hello
为什么还是Hello,因为执行了str="World"的时候,其过程为:首先系统会自动生成一个新的String对象,并把这个新对象的值设为World,然后把对象的引用赋值给str,但是,在这里我们要知道String是fina类型的,因此你不可以继承和修改这个类,str="World",其实就是隐含的让java生成了一个新的String对象
而第二个例子中:StringBuffer是产生一个内存空间,相关的增、删、改操作都在其中进行,所以添加的值是在同一个内存地址中进行的
输入/输出流
Example Ⅰ
请给出一段代码描述字符串写入文件
public static void main(String [] args){
try {
FileOutputStream out = new FileOutputStream("FileName.txt");
out.write("字符串写入文件".getBytes());
out.close();
}catch (IOException ioe){
ioe.printStackTrace();
}
}
Example Ⅱ
写一个Java程序,从键盘输入两个整数,然后输出它们的平方值及立方值
public static void main(String[] args) {
Result result = new Result();
System.out.println("请输入一个整数");
int a = InputData.getInt();
result.print(a);
}
}
class InputData {
static private String s = "";
/**
* 从键盘输入一个字符,保存到字符串s中
*/
static public void input() {
BufferedReader bu = new BufferedReader(
new InputStreamReader(System.in)
);
try {
s = bu.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
static public int getInt() {
input();
return Integer.parseInt(s);
}
}
class Result {
void print(int d) {
System.out.println(d + "的平方:" + d * d);
System.out.println(d + "的立方:" + d * d * d);
}
Example Ⅲ
Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式
面向字节的操作以8位为单位对二进制进行数据操作,对数据不转换,这类都是InputStream和OutputStream
面向字符的操作以字符为单位对数据进行操作,在读的时候将二进制转换为字符,在写的时候将字符转换为二进制数据,这些都是以Reader和Writer为子类
总结:
- InputStream / OutputStream为后缀的是字节流;
- Reader / Writer为后缀的是字符流
本文由 monsterlin 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Jul 28, 2017 at 10:50 pm