Alpha's Tech Space

一个关于软件开发的技术交流空间,希望和大家共同进步!(.net/C/C++/Java)

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

继承和多态

 

Java做为面向对象设计语言的代表,继承和多态这两种典型的特性尤为突出。今天我们就介绍一下这方面的内容。

首先,明确概念:

继承:对于他人提供的已有程序或者经验证排错后的程序的重用。这么说好像有点别扭,那么,换个简单的说法,就是“吃现成的”,当然,“吃”之前可能还要做一些必要的“加工”。

多态:以单一的方法实现不同的行为。这又显得有点抽象了。还得举个例子。比方说,我们说猫会叫,狗也会叫,可描执行这个叫的动作的结果是 miao ,狗呢,是wangwang~。那么对于叫这个动作产生不同结果的情况,我们就称之为多态。在OOP中,多态一般是用于实现由同一基类派生出来的子对象对基类共有行为的个性化。

接着,具体的说明。

 

关于继承我们需要了解和掌握的是:

1 表示方法:继承用extends关键字来指出。格式:class subclass extends superclass.

2 Java语言规定,Java中的类只能显式的继承一个(且不能超过一个)其它的超类。即Java不支持多重继承。

3 为了解决不支持多重继承的问题,Java引入了interface的概念,从而在保持简洁性的前提下,同时获得了多重继承特性的优势。

4 超类和子类之间可以做单向的“类转换”(cast),就像数据类型中强制类型转换那样。但是,只有从子类向基类(超类)的转换是安全的。从基类到子类的转换需要格外小心。

5 子类不能直接访问基类中的私有成员。

 

关于继承后的构造函数。需要记住一点:子类一定会通过不同的方式调用基类的构造函数。

子类继承超类后,子类可以有自己的构造函数。在子类的构造函数内,调用超类的构造函数的方式有两种:

1 显式的调用。格式 super)。以这种方式来调用基类的构造函数时,有明确的规定,即该语句必须时子类构造函数的第一条语句;

2 隐式的调用。其实就是不写super)这句。在这种情况下,Java会为你的子类自动的调用基类的那个没有任何参数的构造函数。

还是用代码来说明:

/*

 * Created on 2005-6-3

 *

 * TODO To change the template for this generated file go to

 * Window - Preferences - Java - Code Style - Code Templates

 */

 

 

/**

 * @author CN1LC1E0

 *

 * TODO To change the template for this generated type comment go to

 * Window - Preferences - Java - Code Style - Code Templates

 */

public class Demo

{

  

   

    public static void main(String[] args)

    {

        TestSubClass demo1 = new TestSubClass();

        TestSubClass Demo2 = new TestSubClass("Try again.");

    }

}

 

 

class TestSuperClass

{

    TestSuperClass()

    {

        System.out.println("TestSuperClass defalut constructor called.");

    }

   

    TestSuperClass(String str)

    {

        System.out.println("TestSuperClass another constructor called. "+ str);

    }

 

}

 

class TestSubClass extends TestSuperClass

{

    TestSubClass()

    {

    System.out.println("TestSubClass constructor 1, call superclass's constructor implicitly.");

    }

   

    TestSubClass(String str)

    {

        super(str);

        System.out.println("TestSubClass constructor 2, call superclass's constructor explicitly.");

       

    }

   

}

 

代码很简单,我想不用过多的解释了。程序运行的结果如下:

 

 

 

TestSuperClass defalut constructor called.

TestSubClass constructor 1, call superclass's constructor implicitly.

TestSuperClass another constructor called. Try again.

TestSubClass constructor 2, call superclass's constructor explicitly.

 

 

 

 

 

 

 

 

通过以上的例子,您应该可以掌握构造函数的调用顺序了。

 

关于多态,我们需要了解的式;

1 多态是通过函数重载和来实现的。

2 重载的要求有三个:基类和子类中被重载的函数名称必须相同;参数类型必须一致;该函数不能是static(这个原因不用解释了吧。回忆一下static的含义?)。

3 重载后的方法可以有不同的访问限定符,但新的限定符一定不能比原有的限定符对此方法做出更多的访问限制。例如,基类中对方法的限定符是protected 那么在子类中的的限定符可以使protected ,也可以是public,这都是正确的,但如果写成private,就不允许了。

 

关于final的说明:

(1)     Final修饰变量时

   变量的值在声明后就不能被修改;

   并且,在声明的同时就必须被初始化。

(2)     Final修饰方法时:

   这个方法不能被重新实现;

   Static and private的方法隐含的成为final的方法.

(3)     Final 修饰类时:

   这个类不能被继承;

   这个类中所有的方法也就隐含的成为final的方法。

 

从上面的说明可以看出,通过final关键字,程序的安全性得到了增强。我们可以利用final的特性,来实现一些特定的功能。例如,如果我们想实现一个类,要求它可以被继承,但所有的方法都不能被重写,那么我们可以声明一个非finalclass,同时将它的方法全部设计为final的,这样就可以达到要求。

当然,我们也可以通过设计抽象类的方式来实现这一个要求。它们之间的不同在于,抽象类中的方法只能声明,而不允许实现。

 

使用继承和多态可以加快我们的代码实现过程并隔离错误,这使得代码的维护过程更加容易.所以,在面向对象程序设计中,这个部分可以认为是其最精华的部分,我们要深入的了解和领会。

 

 

相关文章:
读书笔记:《Java2 教程》(一)

读书笔记:《Java2 教程》(

读书笔记:《Java2 教程》(三)

读书笔记:《Java2 教程》(四)

posted on 2005-06-03 17:10  Lexrate  阅读(809)  评论(0编辑  收藏  举报