每周总结
1.为什么匿名内部类参数必须为final类型
内部类使用外部类的局部变量时,其实是内部类的对象在使用它,
而内部类访问外部方法中的局部变量时,外部方法的局部变量可能已经不存在了,
那么就得为其延续生命,拷贝到内部类中,然而拷贝会带来不一致性,从而需要使用final保持一致性。
2.多态问题之向上转型和向下转型+动态绑定
多态::是指向同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
----只有非私有的实例方法才是多态的,私有方法、静态方法、域都不是多态的---
向上转型:能把子类对象当做父类对象来使用。
有方法的缺失,但转型是安全的。
动态绑定:如果子类重写了父类中的方法,向上转型后使用父类的引用调用这些重写的方法就会调用子类中重写的方法。
向下转型:对象向下转型时,存在一个问题:
若一个父类A的引用a,指向一个子类B的实例,将a赋值给另一个子类C引用时,会抛出java.lang.ClassCastException异常;
抛出异常后程序将不能继续向下执行,为了避免这个异常的抛出,我们可以通过instanceof关键字判断引用指向的实例是否可以进行强制转换成某个子类对象
//已知Animal类有两个子类Dog和Cat:
public class Demo{
public static void main(String[]args){
Animal a = new Dog();
check(a);
}
//设计一个方法,判断一个动物是猫还是狗
public static void check(Animal a){
if(a instanceof Dog){
System.out.println("狗");
}else if(a instanceof Cat){
System.out.println("猫");
}
}
}
package lainxi01;
/**
* 多态的好处
* 正是因为java采用的是动态绑定,保证了向上转型总是能够产生正确的行为
* 因此在一定程度上消除类型间的耦合性
* 下面的程序中,设计draw方法让其接受父类Shape类型的参数,
* 因为是向上转型
* 所以此方法能接受所有的Shape的子类对象
* 因为是动态绑定,所以s总能找到正确的print()方法
* @author nice
*
*/
class Shape{
void print() {
System.out.println("Shape");
}
}
class Circle extends Shape {
void print() {
System.out.println("Circle");
}
}
class Rectangle extends Shape{
void print() {
System.out.println("Rectangle");
}
}
class Square extends Shape{
void print() {
System.out.println("Square");
}
}
public class DrawShape {
public static void main(String[] args) {
Shape s = new Shape();
s.print();
s = new Circle();//向上转型
s.print();
s =new Rectangle();//向上转型
s.print();
s = new Square();//向上转型
s.print();
}
}
3.0单例设计模式之懒汉式饿汉式
4.泛型擦除
程序编译的时候会将泛型去掉,成为泛型的擦除(生成的class文件不带泛型)---是为了兼容运行的类加载器。
5.0什么是哈希表
是一个元素为链表的数组,综合了数组和链表的好处(类似新华词典)
6.0集合的使用技巧
需要唯一吗 | 需要制定顺序吗 | 需要频繁增删吗 | |
TreeSet | 需要 | 需要 | |
HashSet | 需要 | 不需要 | |
LinkedHashSet | 需要 | 可预知迭代顺序 | |
LinkedList | 不需要 | 需要 | |
ArrayList | 不需要 | 不需要 | |
HashMap/HashTable | key唯一 | 仅用于查询 | |
LinkedHashMap | key唯一 | 如果经常修改 | |
7.0如何记录每个容器的结构和所属的体系
看名字,后缀名就是该集合所属的体系,前缀名就是该集合的数据结构。
看到array就想到数组---查询快,有角标
看到Link就想到链表---增删快,有add get removeFirst/last 等方法
看到hash就想到哈希表--就想到唯一性,就想到元素需要重写hashcode和equals方法
8.0TreeMap自定义排序需要实现Comparator接口或者重写compareTo方法?
compreTo是元素具有比较性,让元素所属的类来实现,(自然排序,无参构造)
comparator是集合具备比较性,需要建立一个自己的比较方法(比较器排序,有参构造)
9.0HashSet 存储相同的却只存储了一个呢
通过查看add源码得知,依赖hashcode()和equals()方法-----首先比较哈希值,如果相同,比较地址值或equals(),如果不同就添加到集合中。
那这样就清晰了,如果不重写hashcode()方法和equals()方法,默认使用Object的方法,一般来说不相同。但是还有一句话
上一篇: FreeCodeCamp总结——Bootstrap框架
下一篇: first_week