继承(inheritance)
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。比如可以先定义一个类叫车,车有以下属性:车体大小,颜色,方向盘,论坛,而又由车这个类派生出教程和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。
封装(encapsulation)
类使得数据和对数据的操作集成在一起,从而对使用该类的其他人来说,可以不管它的实现方法,而只管用它的功能,从而实现所谓的信息隐藏。
多态(polymorphism)
多态又分为设计时多态和运行时多态,例如重载又被称为设计时多态,而对于覆盖或继承的方法,JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。总而言之,面向对象的设计的典型特点就是继承,封装和多态,这些特点也是面向对象之所以能如此盛行的关键所在。
单继承与多继承
JAVA不支持多重继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,同时一个类可以实现多个接口,从而克服单继承的缺点。
接口的定义和类的定义很相似,只是关键字不同,关键字为interface。生命格式如下:
- interface 接口名
- {
- }
上面的大括号中为接口体。接口体中包含成员变量定义和方法定义两部分。
接口体中只进行方法的声明,不允许提供方法的实现。所以在格式上只存在方法声明,实际上没有方法体,而方法体要在实现的类中再去具体定义。
还有一点需要说明的是:如果一个类使用了某个接口,就必须要实现这个接口的所有方法,即使实在没有内容只是一个空的方法体也不许要写。而且每个方法都默认是public的,所以实现时代码一定要用public做修饰,参数个数,类型以及返回值的类型都必须与接口中的声明相一致。
例如:
- interface Runable
- {
- }
当某个类要实现这个接口时,就用 imlements 来声明。
例如,我们相做一个多线程的例子,那么就可有两种实现方式,一种是通过定义一个Thread类的子类来实现,另一种是通过实现Runable接口来实现。代码如下(这里的PrintHello类就是通过实现Runable接口来实现的,而不是扩展Thread称为他的子类):
- import java.lang.*;
- class TestThread
- {
- public static void main(String args[])
- {
- try{
- printHello ph = new PrintHello();
- Thread Tph = new Thread(ph);
- for(;;){
- System.out.println("I'm main");
- Thread.sleep(100);
- }
- }
- catch(Exception e){
- e.printStackTrace();
- }
- }
- }
- class PrintHello implements Runnable
- {
- public void run(){
- try{
- for(;;){
- System.out.println("I'm hello");
- }
- }
- catch(Exception e){
- e.printStackTrace();
- }
- }
- }