导读
本文适合Java入门,不太适合Java中高级软件工程师。本文以《Java程序设计基础篇》第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述。本篇文章只是这个系列中的一篇,如果你喜欢这种讲解方式,或者觉得从中能学到知识,可以关注我,以便查阅本系列其他文章。
让我们开始愉快地学习Java语言吧!
1抽象类
定义:
抽象类:没有具体实现,无法使用new实例化,并且使用abstract修饰的类。
抽象方法:抽象方法只有方法头,没有具体的实现。抽象方法使用abstract修饰。
要点:
- 抽象类虽然不能实例化,但可以作为类型使用。
- 抽象类也可以包含实例方法。
- 父类是具体的,其子类可以是抽象类。
- 抽象类的构造方法必须使用protected修饰。
- 一个包含抽象方法的类必须声明为抽象类。
- 非抽象类不能有抽象方法。
- 子类中重写方法可以定义为abstract。
为什么要设计抽象类?
在使用继承建模的过程中,父类具备所有子类共有的特性,这时父类就成了一种契约,约束子类共有的特性。使用抽象类可以实现这种效果。
为什么抽象类的构造方法必须使用protected?
因为抽象类是一种契约,它是仅供其子类使用。
例如:
2接口
语法:
修饰符 interface 接口名 {
//常量
//抽象方法
}
要点:
- 被看做一种特殊的类,每个接口都被编译为独立的字节码文件。
- 只包含常量和抽象方法。
- 不能使用new操作符创建接口的实例。
- 接口继承:用来描述类与接口之间的继承关系。
- 接口中的数据域都被public static final修饰,所以可将这几个修饰符省略。
- 接口中的方法都被public static修饰,所以可将这几个修饰符省略。
- 使用implements实现接口。
- 一个类在继承另一个类的同时可以实现接口。
- 一个类可以实现多个接口,但只能继承一个抽象类
- 接口可以继承其他接口,称之为子接口,被继承的接口称之为父接口。
- 接口没有根接口,但类有共同的根类Object。
- 一个接口类型的变量可以引用任何实现该接口的类的实例。
看一个简单的例子,下面在类B中实现接口Iface,它的两个抽象方法这里没有给出具体实现。
3 Comparable
比较两个对象的大小,一般是指比较两个对象数据域的大小,这种情况下,数据域是数值型,字符串类型,或者是日期。
Comparable定义如下,它是个泛型接口,它只定义了一个compareTo方法。
public interface Comparable {
public int compareTo(T o);
}
当在自己的类总重写Comparable的compareTo方法时,注意还有一个继承来的equals方法,尽量保持compareTo方法与equals方法一致,即compareTo返回值为0,equals返回值为true。
JDK的API中好多类都实现了这个接口,让我们看一个例子:
下图中可以看出,Long的父类是Number,同时实现了Comparable接口
下面是重写的compareTo方法,具体实现是调用了compare方法。
下面是compare方法的实现:
4Cloneable接口
使用Cloneable定义一个对象可以被拷贝。
来看下Cloneable的定义:
你会发现,什么都没有,我们称这样的一个带空体的接口为标记接口。
如果一个类实现了Cloneable接口,那么它必须重写Object的clone()方法。
让我们看看JDK API中Date类如何实现Cloneable即重写clone()的。
下面Date实现了三个接口java.io.Serializable, Cloneable, Comparable
先声明一个Date类型的变量d,然后调用Object的clone方法,将其返回值赋给d,然后调用sun.util.calendar.BaseCalendar的clone方法复制对象,最后返回对象d。