JavaSE 关于复杂对象生成过程与try-finally的理解
2013-05-11 09:52
357 查看
今天在论坛里看到两段比较有意思的代码,记录下来我的理解。
这两题我都答错了,随后通过帖子的回复和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; //2 System.out.println(x + ": :" + y); } } /*Output: Child 20: :20 10 */
首先,我知道创建子类前会先创建父类。顺便提一下创建的顺序是:静态变量/代码块(父->子类)>属性变量/代码块>构造方法。
第二,属性是没有多态的,在哪个类里就用对应的属性。例子中的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: 1 1 3 */
首先java是传值的。
try 里的return 是先于finally执行的,执行到return时x==1 ,return x; 相当于return 1;
然后去执行finally 里的x = 3;这个时候和return 已经没有什么关系了。
第2题,传进来的是一个对象的引用。
可以这样想,JVM操作的是入参的一个副本,而不是入参那个变量本身。
x 就相当于x1的副本,它俩指向同一个对像,所以通过 x 可以修改对象里面的值,但是改变 x 的指向对 x1 是没有影响的。
相关文章推荐
- javaSE_8系列博客——Java语言的特性(一)--关于面向对象基本概念的理解(1)
- 关于tryc..atch...finally与return的最容易理解总结
- 关于面向对象和面向过程的程序设计思想的思考和理解
- 关于面向对象和面向过程之我的理解
- java基础之关于面向对象和面向过程的理解
- 关于输出null对象,以及try/catch/finally比较好玩的一段代码
- 关于初学者如何理解面向对象和面向过程的区别以及java中的类和对象
- javaSE_8系列博客——Java语言的特性(一)--关于面向对象基本概念的理解(2)--对象
- java基础之关于面向对象和面向过程的理解
- 关于 new String("xyz")创建几个对象的理解
- java中关于try、catch、finally中的细节分析
- JAVA初学:关于“面对对象”的一些理解与感悟
- 关于面向对象和面象过程的一些感想
- 深入理解Java对象的创建过程:类的初始化与实例化
- 关于 new String("xyz")创建几个对象的理解
- java中利用类名生成Class对象,通过class对象创建实体类的理解
- MySQLdb Python模块autocommit属性测试及测试过程中关于数据库连接的理解
- 关于JAVA的try catch finally的return返回值问题
- try-catch-finally中return语句执行的理解
- 关于Js OOP编程 创建对象的一些理解。