这次主要记录抽象类、接口和String的其它学习。
抽象类
什么是抽象类呢?定义一个类,我们可以不必完全实现它里面的功能,这就是抽象类。没有具体的方法,就是抽象。
下面是具体的使用。
1 | abstract class Animal //定义一个抽象类animal |
因为抽象类很多方法并未实现,我们也不能new一个抽象类的对象。不能凭空产生一个方法。
要想使用抽象类的方法,我们只能继承,如果子类也不能全实现抽象类的方法,那子类也必须是抽象类,直到能全实现方法的子类,我们新建对象。
1 | public class abstractTest { |
接口
接口和抽象类差不多,但是,比抽象类更规范。
它不实现任何方法,它的一般只有常量和抽象方法。
1 | interface Car |
下面是例子。
1 | public class Test { |
抽象类和接口的共同点:
1、都有抽象方法。
2、都需要被子类继承。
抽象类和接口的不同点:
1、抽象类的变量只是普通变量,接口是常量。
2、抽象类可以有具体的方法。
3、接口相比抽象类讲,定义的是一种规范。
4、接口可以多继承。
String
String是不可变的引用类型。使用的时候总会产生很多新的对象,所以就有了StringBuffer和StringBuilder两个类,它们都是继承于AbstractStringBuilder这个抽象类,而都现实了父类的方法,所以它们相当于双胞胎兄弟。
而双胞胎也有差别,它们的差别就是线程是否安全。
StringBuider下实现append()方法
1 | @Override |
StringBuffer下实现append()方法
1 | public synchronized StringBuffer append(Object obj) { |
看得出来,区别不是很大,只是在StringBuffer下,方法都多了一个synchronized修饰符,该修饰符保证线程安全。
线程安全解决啥呢。大致就是我们使用电脑时,不是一个只运行一个软件,而是很多个在同时运行,这时有多个软件修改了一个文件内容和多个软件同时获取该文件内容,在同一时间下,就可能出现错误。所以要保证线程安全,一个一个来,慢慢校验。所以线程安全提供了安全性,但效率会降低。
而StringBuider和StringBuffer方法都差不多一样,所以了解其中一个就行,以Stringbuider为例。
方法名 | 使用说明 |
---|---|
append(Object) | 实现多个字符串拼接,可以为任意类型 |
delete(int, int) | 删除起始位置到终止位置(不包括终止位置)之间的元素 |
deletCharAt(int) | 删除该下标的元素 |
replce(int, int, String | 把起始位置到终止位置(不包括终止位置)之间的元素修改为新的字符串 |
insert(int, Object) | 在该下标插入某个元素 |
1 | public static void main(String[] args) { |
这是都是StringBuider常用的方法,当然还有indexOf()、lastIndexOf()这样的字符匹配,length()长度,equals()比较内容等等,这些以前也用过的方法。