java--初始化与清理

从java1.5依赖提供了一个我很喜欢用的功能Foreach功能,方便使用,简单,等等好处就不一一列举了,具体实现原理是什么就不大懂了,没有做过压测,所以具体性能如何,也不得而知,只是看网上同仁又说性能不及普通的for循环,当然这里提一提的主要原因在于问题,说呢,有人在用foreach做迭代的时候发现如果对集合类做了remove操作之后会报异常,这一点估计跟他的实现原理有关系吧,所以我的方式就是规避(),所以果断对于有remove操做的集合使用Iterator之后使用while循环来处理。

好了,开始今天的正题。

switch 功能,说实话习惯了用if这个到真心用的不多,至少目前用的不多,经历了不同的版本变迁后switch也发生了不少变化,从1.5开始增加了enum类型,1.7开始支持了C#中才有的string类型(其实个人感觉既然string都是静态不可变类,支持应该是一开始就该有的功能啊)。

在java的方法重载中有一点很容易犯,而且是不小心犯,以前没注意,知道遇到了,百思不得妻姐后才明白。在java中我们知道在方法重载的时候只要参数列表不同,就OK了,那么出现function a(int a),和function a(long b)这种一点都不稀奇,可是在你传递参数的时候就有问题了,因为如果你给的是一个int值,那么这两个函数应该来说都可以调用的,所以你让系统郁闷了一把。所以对于有类型升降的参数一定要注意,这里当然指的不只是基本类型了,复杂类型的多态也是要注意的哦。

顺带提一下,有人问为什么返回值类型不能作为区分两个方法重载的条件,这里借用别人的观点,方法的返回值也许在你定义的时候你知道返回值是不同的,但是真正的作用体现在他被调用的时候,所以这时候方法是按照你的方法所在类找到对应的类,然后再找方法同名的,接下来根据传递参数找到对应的方法,如果你在奢望他知道要通过返回值理解调用哪个方法,那就之能通过执行结果来判断了,那系统最笨的办法就是有多少种这种方法就调用多少次,完事了跟你的执行期望来判断需要那个执行的结果,但是这还是一个理想状况(尽管这已经很扯淡了),如果你压根没想要返回结果,那系统就彻底傻眼了。所以代码的执行不能期望系统通过执行结果来判断应该调用哪个,那就成了“因为有了鸡蛋,所以这肯定是鸡下的”。

通常情况下我们很少关注方法如何区分是哪个实现类来调用的,比如下面的

 

public class Test2 {
	int i = 0;
	public Test2(int i){
		this.i = i;
	}
	public void test(){
		System.out.println(i);
	}
	public static void main(String[] args) {
		Test2 t1 = new Test2(1);
		Test2 t2 = new Test2(2);
		t1.test();
		t2.test();
	}
}

 上面的代码中我们创建了t1,t2,按照之前的理解,在执行t1.test()的时候,先找到了Test2这个对象,然后找到对象的方法,接着执行,这里就有点问题了,那他怎么知道自己是那个实例在调用他执行的呢?

查看class文件我们可以找到具体的执行中有一段

代码截图

可以看到执行的时候依然使用的是:package.class.method.区分的地方正在于aload_1[t1],这里的解释又说method实际上是将对象本身也作为参数传递近了方法,所以方法就知道是那个实例调用了他,比如:package.Test2.test(t1)

具体是否这样不太清楚,不过这样倒是能解释通。使用this或者super调用构造函数的时候要注意,都必须放在行首,否则执行会有问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值