java易忽略知识点
1.变量类型:
类变量,即每个类中用static修饰的变量,这种变量属于类,而不是属于对象。
成员变量,独立于方法之外的变量,即C++中的成员变量,这种变量属于对象。
局部变量,存在于类的方法中的变量。
2.修饰符
static 修饰符,用来创建类方法和类变量。
final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
abstract 修饰符,用来创建抽象类和抽象方法。
synchronized 和 volatile 修饰符,在多线程编程中非常重要,后续深入讲解。
3.字符串类String
该类是不可改变的,一旦创建了String对象,那么它的值就无法改变了。这一点可能与我们一般理解有点出入,例如:
String str=“abc”;
str+=“def”;
这个时候str难道不是改变了吗?实际上,这样理解是不对的。真相是,str是指向了一个新的对象,这个对象的值为"abcdef",而在原来的内存中“abc”对象仍然存在。
对于String类,无论是sub,concat还是replace操作而言,都不是在原来的String对象基础上进行,而是重新生成了新的字符串对象。永远记住一点:“String对象一旦被创建就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象”。
既然String不可变,每次改变内容的操作都会导致重新创建对象,在一个循环体内,大量重新赋值操作自然是很浪费时间的。因此,在这种情况下,并不建议使用String类,而应该使用StringBuilder或者StringBuffer。StringBuilder和StringBuffer是可变字符串对象,区别在于,StringBuffer是线程安全的,而StringBuilder不是,但StringBuilder速度较快。(何为线程安全,简单来讲,多线程环境下对该类对象的多次操作不会导致结果未知,具体的内容,后续详解。)
4.hashmap和hashtable的区别:
1)Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
2)Hashtable中,key和value都不允许出现null值。在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
3)哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
4)Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
5.基本数据类型与对应封装类型
1).Java 中的数据类型分为基本数据类型和引用数据类型
int是基本数据类型,Integer是引用数据类型;
Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。
2) 自动装箱:将基本数据类型封装为对象类型,成为一个对象以后就可以调用对象所声明的所有的方法。
Integer num = 10;
以上的声明就是用到了自动的装箱:解析为 Integer num = new Integer(10);
自动拆箱:将对象重新转化为基本数据类型。
Integer num = 10;
int num1 = num;
自动拆箱有个很典型的用法就是在进行运算的时候:因为对象是不能直接进行运算的,而是要转化为基本数据类型后才能进行加减乘除。
6.重载与覆盖
1).方法重载(overload)需要满足的条件:
* 方法名相同
* 方法的参数类型,个数以及顺序至少有一个不相同
* 方法的返回类型可以不相同
* 方法的修饰符可以不相同。
必须强调的是,判断两个方法是否完全相同,是依据方法名和参数签名两项决定的。而参数签名是指参数的类型,个数以及顺序。
2).方法覆盖(override)
覆盖方法需要满足的约束很多,最基本的包括:
* 子类方法的名称,参数签名和返回类型必须与父类方法一致.存在一种情况,子类可以先覆盖父类的一个方法,然后自己定义一个重载的方法。
* 子类方法不能缩小父类方法的访问权限。
* 方法覆盖只存在于子类和父类之间,在同一个类中方法只能被重载,不能被覆盖。
7. 接口(interface)
可以解决java不支持多继承的问题。即可以继承自一个父类,但同时实现多个接口。
1)接口中的成员变量默认都是public static final类型的,因此必须在定义时显示初始化
2)接口中的方法默认都是public abstract类型的
3)接口不能被实例化,但是可以定义接口类型的引用变量。
4)接口必须通过类来实现它的抽象方法,implements。当类实现了某个接口时,它必须实现接口的所有的抽象方法,否则这个类必须被定义为抽象类。
5)一个类只能继承自一个直接的父类,但能实现多个接口。