return语句在顺序结构中的用法
结束该方法,继续执行方法后的语句。return在try-catch-finally语句中的使用
public class TestFinal { public static void main(String[] args) { System.out.println("test1:" + testFinal1()); System.out.println("test2:" + testFinal2()); System.out.println("test3:" + testFinal3()); System.out.println("test4:" + testFinal4()); } static int testFinal1() { int i = 1; try { return i; } finally { System.out.println("in testFinal1():finally 肯定执行"); i = 48; } } static String testFinal2() { String str = "try"; try { return str; } finally { System.out.println("in testFinal2():finally 肯定执行"); str = "finally"; } } static StringBuilder testFinal3() { StringBuilder build = new StringBuilder("try "); try { return build; } finally { System.out.println("in testFinal3():finally 肯定执行"); build.append("finally"); build = new StringBuilder("你猜我是谁!"); } } static String testFinal4() { try { return "return in try"; } finally { System.out.println("in testFinal4():finally 肯定执行"); return "return in finally"; } } }
输出是:
在testFinal1()中,return i;会将结果i的值,也就是1压入栈。即使在finally中将i修改了(i=48),也不回对已经压入栈里的1造成任何影响。
in testFinal1():finally 肯定执行 test1:1在testFinal2()中,return str;将str的内容压入栈,比如我们假设str的内容为0x108(只是一个地址值),通过这个地址值我们能找到"try",那栈里的内容就是0x108。执行str = "finally",这时候str这个变量的内容可能变为0x237了,这是串"finally"的地址。方法调用结束后,返回的是什么?return时压入栈里的0x108。所以在打印结果时,我们打印的是通过0x108找到的字符串"try"。
in testFinal2():finally 肯定执行 test2:try在testFinal3()中,return 压栈的是build这个变量的值,比如是0x3579,通过这个值我们可以找到StringBuilder对象。finally语句块中对这个对象的内容进行了修改。build = new StringBuilder("你猜我是谁!");让build变量指向了一个新的对象,这时候build的值可能是0x4579了。但是,别忘了,原来的StringBuilder对象仍然在0x3579处,而我们压栈的正是0x3579啊!方法返回后,我们得到的返回值0x3579,通过这个引用值找到相应的StringBuilder对象,所以打印的结果是test3:try finally。
in testFinal3():finally 肯定执行 test3:try finally在testFinal4()中,finally有return语句,直接返回,方法结束。
in testFinal4():finally 肯定执行 test4:return in finally