Java 进阶篇
Java常见接口
Comparable
public interface Comparable<T> {
public int compareTo(T o);
}
-
类对象之间比较“大小”往往是很有用的操作,比如让对象数组排序时,就需要依赖比较操作。对于不同的类有不同的语义。如Student类,比较2个学生对象可以比较他们的score分数来评判。
-
该接口是让我们给我们的实体类增加排序规,比如a与b比,如果a.compareTo(b)大于0说明a比b大,反之b比a大,相等说明一样大
-
由于对象默认没有实现这个接口,我们无法比较两个对象的大小,当我们的对象具有一定的顺序,而且要是用TreeSet进行存储时,必须实现此接口或者在TreeSet排序时传入一个Comparator比较器,否则报错!
-
我们的常用的String,包括基本数据类型的封装类,比如Integer,Double等都继承了这个接口。
Runnable
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
-
Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口;
-
实际上Thread类也是Runable的子类,我们在Thread初始化是传入一个Runnable,实际上是让Thread去指向新的run方法。
-
Runnable接口非常简单,就定义了一个方法run(),继承Runnable并实现这个方法就可以实现多线程了。但是如果直接对象.run()方法,则没有任何意义。需要我们把这个实现了Runnable的类传入到Thread的构造方法中,再调用Thread的start方法才是线程开启的正确打开方式!
Cloneable
public interface Cloneable {
}
这个接口没有任何内容,当类加载器运行时,如果发现一个类实现类Cloneable接口,那么这个类就可以调用Object的clone方法,没实现则抛出异常。
Object的clone方法是protected修饰的,Object是所有类的父类,子类都可以访问到。
public class Object {
protected native Object clone() throws CloneNotSupportedException;
}
我们定义一个类,尝试使用一下super的clone方法
public class Demo3 {
static int haha=2;
public static void main(String[] args) throws CloneNotSupportedException {
Demo3 demo3 = new Demo3();
Demo3 clone = demo3.clone();
System.out.println(clone.haha);
}
@Override
protected Demo3 clone() throws CloneNotSupportedException {
return (Demo3)super.clone();
}
}
这里报错了!
但是如果我们实现了这个接口,就能正常使用,控制台打印2
public class Demo3 implements Cloneable{
这是Java早期的产物,如果换做现在,我们可能会让他实现一个@Clonable注解只要实现了这个注解,就能成功clone()。
Serializable
public interface Serializable {
}
也是一个没有方法的接口,只要JVM运行的时候,扫描到一个类实现了这么一个接口,那么这个类就可以被序列化,即能被对象流ObjectWriter和ObjectReader等一些流对象操作。
优秀博文参考
Comparable链接
Clonable链接
Iterator链接
Serializable链接
Runnable链接