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

问题描述

public class FinallyTest {public static void main(String[] args) {System.out.println(new FinallyTest().test());//这个打印结果为1.System.out.println(new FinallyTest().get());// 这个打印结果为2.}//调这个就打印1static int test() {int x = 1;try {return x;} finally {++x;}}//调这个就打印2static public int get() {try {return 1;} finally {return 2;}}} 问题补充:为啥那个String的改变了?suziwen 写道

解决方案

finnaly不影响返回结果的,在return 之前,return的值被储存在临时变量里,finally无论做如何操作都不影响返回的值,除非在finnaly又返回了另外的值
解决方案二:
因为返回的是对像的引用~~~ 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 byteshort int long float double这些是返回值本身,而像对像返回的是引用 (类似指针)
解决方案三:
楼主可以试着这样玩一下把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的引用 )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;}
解决方案四:
程序中通常不会把return放在finnaly中
解决方案五:
JAVA执行顺序是一行一行的,如果没有分歧就继续执行,有分歧就跳转分歧,执行完了回来继续执行。
解决方案六:
//调这个就打印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

时间: 2024-09-14 06:10:32

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

编程题-面试中碰到的java基础题

问题描述 面试中碰到的java基础题 今天面试碰到这么一个问题,想了半天,不知如何回答 P1=V1; P2=V2; method(P1,P2){ P1=V3; P2=V4; } 结果是P1=V1;P2=V4;问P1P2是什么类型的时候才会出现这种情况 解决方案 在传递的时候,如果传递的是原生数据类型,则值不会改变 public class Test { public static void main(String[] args) { int a = 1; int b = 2; swap(a,b)

怎么都想不通的java基础题

问题描述 求教:最好能够深入虚拟机来讲解,图文并茂那就最好不过了一public class Test { public static void main(String[] args) { Integer i1 = 127; Integer i2 = 127; System.err.println(i1 == i2); i1 = 128; i2 = 128; System.err.println(i1 == i2); } } 二方法m1和m2有区别吗?什么区别public class Test {

java基础题关于StringBuffer,求教

问题描述 publicclassBuffer{publicvoidswap(StringBuffera,StringBufferb){a.append("more");b=a;}publicstaticvoidmain(String[]args){StringBuffera=newStringBuffer("One");StringBufferb=newStringBuffer("Two");Bufferbuffer=newBuffer();bu

分享一道java基础题,测测你是不是基础扎实

下面的这个题你知道输出结果是什么吗?试试吧!相信对每一个学java的同学都是有用的!说不定下次你去面试就是这个题!当然你是技术大牛可以忽略! 最新内容请见作者的GitHub页:http://qaseven.github.io/

一道Java基础题,来个牛人

问题描述 package com.huawei.test;import java.util.HashMap;public class HashTest {public static void main(String[] args) {getSize1();getSize2();}public static void getSize1(){HashMap<Object, String> instance = new HashMap<Object, String>();instance

java-Java基础题大牛们给解决下,基础题大道理。

问题描述 Java基础题大牛们给解决下,基础题大道理. 设有整形变量a和b的值分别为5和110.试指出执行了以下循环语句后,变量x和y的值分别是多少? while(x<=y)x *=2; 这是一道课本上的题,看了半天也没看清楚说了什么...还望大神们给解释解释... 解决方案 你指的a和b是 X和Y吧! 这句话的意思就是 当x { 让X=X×2;也就是让X变为原来的2倍,只要X得到的值小于Y,那么就继续这个循环,:也就是说当X=5,Y=110时,我们要执行循环 5×2×2×2×2×2 = 160

java 基础编程题,急求结果

问题描述 java 基础编程题,急求结果 1,int isVesuvian(int n),如果n是有且仅是两组不同的两个数的平方和,返回1,否则0. 2,int isOneBalanced(int a[]),判读数组是否是平衡数组,开头连续为1的数 + 结尾连续为1的数 = 中间连续不为1的数 结果返回1,否则为0. 3,int closestFibonacci(int n),返回比n小的最大的斐波拉契元素.斐波拉契数列 1 1 2 3 5 8 13 21 34 PS:1 1 2 3 5 8 1

方法-初学的IT女孩,求正确解答JAVA基础概念

问题描述 初学的IT女孩,求正确解答JAVA基础概念 在面向对象编程里,每个对象...选择下面一个正确选项: a. 是另一个对象的一个属性 b. 是一个类的一个实例 c. 继承一个类 d. 具有递归方法 选择正确的语句或者JAVA里关于面向对象编程的语句(多选题) ? 继承模型IS-A关系,其中子类的对象还是超类的对象. ? 在一个超类里的方法的数量总是高于其每一个子类 ? 同样的超类的两个子类总是有相同数量的方法. 在JAVA里选择正确的关于可见度的答案.当一个属性(实例变量)在一个类里被定义

原创Hadoop基础题库

原本想出至少50题hadoop, HDFS, MapReduce, Zookeeper相关的基础题,现在暂时不进行了,把已经出的20多道题都奉上. 暂时没有了出题的动力,可能觉得这东西出成题也没啥意义.总之权当巩固,各位权当消遣着瞧瞧. //Hadoop基础 Doug Cutting所创立的项目的名称都受到其家人的启发,以下项目不是由他创立的项目是 A. Hadoop B. Nutch C. Lucene D. Solr 答案:D 配置Hadoop时,JAVA_HOME包含在哪一个配置文件中 A