您的位置:首页 > 编程语言 > Java开发

Java基础笔记一

2016-04-04 11:03 344 查看
回过头来看当初的Java书籍,发现原来很多不是很清晰的地方逐渐明朗起来,好记性不如烂笔头,记下来方便后面查看。

1.实例变量的初始化时机。

 在程序中,当调用指定的构造器来创建Java对象时,该构造器肯定会执行,除此之外,该类所包含的非静态初始化块也会有执行,并且总是在构造器执行之前执行,他们执行的顺序为在代码中的顺序,由上至下。

  当创建任何Java对象时,程序总是先依次调用每个父类的非静态初始化块,父类构造器执行初始化,最后才调用本类的非静态初始化块,构造器执行初始化。至于调用父类的哪个构造器执行初始化,分为以下几种情况:

1)子类构造器执行体的第一行代码使用super显示调用父类构造器,系统将根据super调用里传入的实参列表来确定调用父类的哪个构造器;

2)子类构造器执行体的第一行代码使用this显示调用本类中重载的构造器,系统将依据this调用李传入的实参列表来确定本类的另一个构造器(执行本类中的另一个构造器时即进入第一种情况)

3)子类构造器执行体中既没有super调用,也没有this调用,系统将会在执行子类构造器之前,隐式调用父类无参数的构造器。

注意:super与this必须在类构造器第一行代码,同时二者只能同时取一,并且最多只能调用一次。

  这里提出一个问题:Java对象是由构造器创建的吗?构造器只是对对象的属性进行初始化,如果属性是基本类型,则初始化为0或者false,如果是引用类型,则初始化为null。在这一系列操作之前,该对象的内存已经分配好了。

2.Java闭包。

 在这里简单介绍Java闭包。这里主要通过理解所有内部类访问的局部变量,这些局部变量必须使用final来修饰,否则无法通过编译。这是因为,内部类可能会扩大局部变量的作用域,如果这些局部变量没有使用final来修饰,也就是说这些变量可以随意改变。那么当定义该局部变量的方法执行完,该局部变量应该被回收,但是由于内部类还在使用该局部变量,并且可以改变它的值,所以会引起极大的混乱,因此规定:所有被内部类引用的变量必须使用final修饰符修饰。

3.HashSet与HashMap

在介绍这两者之前,需要先介绍Set与Map,Set元素是不重复的,Map中的元素也是不重复的,其中,Map提供了返回所有key组成的Set集合,Set<K> keySet();也就是说,Map中的所有key是不能重复的,key之间呢也没有顺序。由上可知,Map集合的所有key 将具有Set集合的特征,因此,换种思维方式,Map是Set集合的另外一种表现形式。现在来讲,HashSet与HashMap。HashMap相信有些Java基础的同学都知道它的底层原理,这可是大多数面试经常问的,这里就不介绍了。HashSet是如何实现的呢?查看源码可以看到有一个这样的定义: private
transient HashMap<E,Object> map; 其中private static final Object PRESENT = new Object(); 看到这里应明白了不少。HashSet底层是通过HashMap来实现的,其中的Object定义的为静态final,意味着不可变。这样HashSet就可以使用HashMap的众多方法了,因此本质上两个集合的是没有区别的。注意:  在往HashSet里面添加元素时,如果已经存在了一样的元素,新添加的集合元素不会覆盖已有的集合元素,想想为啥?因为它底层是HashMap,HashMap在更新元素的时候,如果key相同,只会更新Value
的值,并不会覆盖key 的值。所以如何正确的保证其中的元素不是重复的呢?我们如果想将某个类的对象当成HashMap的key,或者试图将这个类的对象放入HashSet中保存时,重写该类的equals方法与hashcode方法很重要,而且这两个方法返回值必须保持一致,也就是说如果两个对象的hashcode返回值一样,那么equals方法也必须返回true。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java