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。
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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树