JavaSE 关于复杂对象生成过程与try-finally的理解

今天在论坛里看到两段比较有意思的代码,记录下来我的理解。
这两题我都答错了,随后通过帖子的回复和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 是没有影响的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值