java 基础题, 但不简单. 反正我很费解. 很费解.为什么调两个差不多的方法打印的结果不同?

public class FinallyTest {
public static void main(String[] args) {
System.out.println(new FinallyTest().test());//这个打印结果为1.
System.out.println(new FinallyTest().get());// 这个打印结果为2.
}

//调这个就打印1
static int test() {
int x = 1;
try {
return x;
} finally {
++x;
}
}
//调这个就打印2
static public int get() {
try {
return 1;
} finally {
return 2;
}
}
}

finnaly不影响返回结果的,在return 之前,return的值被储存在临时变量里,finally无论做如何操作都不影响返回的值,除非在finnaly又返回了另外的值

//调这个就打印1
static int test() {
int x = 1;
try {
return x;
} finally {
++x;
}
}

这个方法调return x;点返回1 ,返回后变量x+1又。
//调这个就打印2
static public int get() {
try {
return 1;
} finally {
return 2;
}
}

第二个,执行到这里finally是必须执行的,无论你有没有错误都必须执行的,return 1的时候还没有执行完,所以继续执行,一看返回2执行完毕,所以返回2

JAVA
执行顺序是一行一行的,如果没有分歧就继续执行,有分歧就跳转分歧,执行完了回来继续执行。

程序中通常不会把return放在finnaly中

楼主可以试着这样玩一下
把return x;和return 1;都注释掉。
然后就可以看到IDE提示注释掉return x;的方法报错,注释掉return 1;的方法没有报错

再有一个需要说的是finally是java语法里已经定义好的,在方法返回之前都必须进行操作的代码块,因此在return后,jvm会把return的变量值(或者引用)保存在另一个地方,然后执行finally里面的代码,这时候如果你去改变x的值是没有任何作用了,因为返回值已经在另一个地方了,但是如果你在finally代码块里也有return语句时,这时新的return 里的变量会重新覆盖掉先前那个中间值上(也就是另一个地方的那个变量值,嘿嘿)。所以你的那个return x;之后再++是不起作用的。而return 1后再return 2 时是采取覆盖的方式。

当然,楼主可以看看下面的代码执行结果,想想为什么 这里的testa方法的返回值却可以通过finally来进行改变(java的引用 )

[code="java"]public class FinallyTest {
public static void main(String[] args) {
System.out.println(new FinallyTest().test());//这个打印结果为1.
System.out.println(new FinallyTest().get());// 这个打印结果为2.
System.out.println(new FinallyTest().testa().a);// 这个打印结果为2.
}

//调这个就打印1 
static int test() { 
int x = 1; 
try { 
return x; 
} finally { 
 ++x;
} 
}


static A testa() { 
    A x = new A();
    try { 
        x.a = "123";
    return x; 
    } finally { 
    x.a="234";
    x=null;
    System.out.println(x);
    } 
    }
//调这个就打印2 
static public int get() { 
try { 

return 1; 
} catch(Exception e){
    return 3;
} finally { 
return 2; 
} 
} 
}

class A{

public String a;

}[/code]

因为返回的是对像的引用~~~

A x = new A();

try {

x.a = "123";

return x; //返回的是x的引用
} finally {

x.a="234";

x=null;

System.out.println(x);

}


int x = 1;

try {

return x; //返回的是基本类型
} finally {

++x;

}

java的原始类型
boolean
char
byte
short
int
long
float
double
这些是返回值本身,
而像对像返回的是引用 (类似指针)