JavaSE 关于复杂对象生成过程与try-finally的理解
来源:互联网 发布:2016淘宝客推广 编辑:程序博客网 时间:2024/05/15 05:45
今天在论坛里看到两段比较有意思的代码,记录下来我的理解。
这两题我都答错了,随后通过帖子的回复和Debug后自己整理出的结论,不一定全正确。
一、关于复杂对象的生成
首先,我知道创建子类前会先创建父类。顺便提一下创建的顺序是:静态变量/代码块(父->子类)>属性变量/代码块>构造方法。
第二,属性是没有多态的,在哪个类里就用对应的属性。例子中的x可以看作是2个完全不同的变量,只是都叫一个名字而已。
接下来分析这上面这段代码,因为new Child();显然要创建Father()对象,由于方法是多态的,所以1处要调用Child的add(int)方法。
在2处是要用Child里的x,但这个时候它还没有执行x = 9; 也就是说它是默认的初值0,到此Child对象初始化的过程就清晰了。
二、关于return 与 finally
首先java是传值的。
try 里的return 是先于finally执行的,执行到return时x==1 ,return x; 相当于return 1;
然后去执行finally 里的x = 3;这个时候和return 已经没有什么关系了。
第2题,传进来的是一个对象的引用。
可以这样想,JVM操作的是入参的一个副本,而不是入参那个变量本身。
x 就相当于x1的副本,它俩指向同一个对像,所以通过 x 可以修改对象里面的值,但是改变 x 的指向对 x1 是没有影响的。
这两题我都答错了,随后通过帖子的回复和Debug后自己整理出的结论,不一定全正确。
一、关于复杂对象的生成
public class Test01 {public static void main(String[] args) {Father f = new Child();System.out.println(f.x);}}class Father {int x = 10;public Father() {add(20);//1}public void add(int y) {System.out.println("Father");x += y;}}class Child extends Father {int x = 9;public void add(int y) {System.out.println("Child");x += y;//2System.out.println(x + ": :" + y);}}/*Output:Child20: :2010*/
首先,我知道创建子类前会先创建父类。顺便提一下创建的顺序是:静态变量/代码块(父->子类)>属性变量/代码块>构造方法。
第二,属性是没有多态的,在哪个类里就用对应的属性。例子中的x可以看作是2个完全不同的变量,只是都叫一个名字而已。
接下来分析这上面这段代码,因为new Child();显然要创建Father()对象,由于方法是多态的,所以1处要调用Child的add(int)方法。
在2处是要用Child里的x,但这个时候它还没有执行x = 9; 也就是说它是默认的初值0,到此Child对象初始化的过程就清晰了。
二、关于return 与 finally
public class Test {int x;public int inc() {try {x = 1;return x;} catch (Exception e) {x = 2;return x;} finally {x = 3;}}public StringBuffer inc(StringBuffer x) {try {x.append("1");x = new StringBuffer();return x;} catch (Exception e) {x.append("2");return x;} finally {x.append("3");x = new StringBuffer("4");}}public static void main(String[] args) {Test t = new Test();int x = t.inc();System.out.println(x);//System.out.println(t.x);StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1);System.out.println(x1);System.out.println(x2);}}/*Output:113*/
首先java是传值的。
try 里的return 是先于finally执行的,执行到return时x==1 ,return x; 相当于return 1;
然后去执行finally 里的x = 3;这个时候和return 已经没有什么关系了。
第2题,传进来的是一个对象的引用。
可以这样想,JVM操作的是入参的一个副本,而不是入参那个变量本身。
x 就相当于x1的副本,它俩指向同一个对像,所以通过 x 可以修改对象里面的值,但是改变 x 的指向对 x1 是没有影响的。
- JavaSE 关于复杂对象生成过程与try-finally的理解
- JavaSE程序分析002 try-catch-finally与return的小事情
- try-finally与try-catch-finally的…
- try后的finally的执行过程
- Python中try...except...finally的理解
- try catch finally 理解
- 关于try{....return;}finally{....}的疑问
- 关于try/catch...finally的性能
- 关于try,finally执行顺序的分析
- 关于一个try、finally的问题解释
- 关于try,finally中return的顺序
- 关于 try catch finally的运行流程
- 关于try-catch-finally的一点思考
- 关于中断try-catch-finally的小结
- 关于try-finally
- 关于try-catch-finally
- 关于try finally解惑
- 关于输出null对象,以及try/catch/finally比较好玩的一段代码
- 视图类动态创建视图窗口
- 从最大似然到EM算法浅解
- surfer 8 scripter 学习笔记(2)Application对象
- 如何把string的元素逆序
- Factorial of a number
- JavaSE 关于复杂对象生成过程与try-finally的理解
- u-boot移植记录
- ns 2.35 柯志亨书-实验3笔记-TCP UDP模拟
- 《TCP/IP详解》第九章 IP选路
- oracle中imp命令详解
- poj_1258(Prim算法)
- 2013多玩YY-校招-分割字符串
- Fibonacci Numbers
- DSG-RealSync Oracle数据库同步复制及容灾技术简述