您的位置:首页 > 编程语言 > Java开发

Java 基础(三) 继承 多态 -------面向对象的特殊性能

2012-03-07 11:04 309 查看
http://hi.baidu.com/drmfslc5/blog/item/3e58130269467b0f728da5a5.html

继承 面向对象程序设计的重要组成部分

首先,理解继承的概念。

现实生活中,儿子继承父亲的产业,利用父亲遗留下来的资源,免去了自己的打拼。Java中的继承也可以这样理解,核心就是“代码重用”。也就是资源再利用,这样提高了代码的编写效率,也提高了运行的效率。

继承是面向对象程序设计基本特点之一,通过继承使得代码重用得以实现。程序员自己编写设计良好的类,可以制作成类库(.jar)这样这些类不但可供自己使用,也可通过释放接口给其他程序员使用。Java本身就设计了功能强大的类库,通过继承的方式使我们可以很好地实现所需的功能。如Thread类,极大提高了编程效率。

其次,如何在java中实现继承

extends
关键字

例:class myThread extends Thread{}

这时候 myThread 就是Thread的一个子类 (派生类) Thread是myThread 的父类(基类)

PS:用红字写的一个表明,Thread可以有多个子类,但myThread只可有一个父类。java中是单继承的。

然后,super
关键字

子类在继承父类后,新声明的同名特性(属性与方法)会被覆写。这时如果想要用到父类的的特性时,就可以用到super关键字,它代表父类。通过它调用的特性都是父类的。super()是调用父类的构造方法。
不继承任何类的类中的super指的是Object的类,因为Object(java.lang.Object)是一切类的基类(类根),任何类都默认继承Object类。

最后,对于继承需要注意的几点:

1,继承后子类自动可用父类中用protected 和public 修饰的属性与方法。

2,如果子类中增加了新的特性(属性与方法),那么子类是新旧特性集。

3,如果写了父类的非静态的同一属性与方法,使用新的特性(方法的重写(或叫覆写) )下面多态中的重点

4,初始化顺序 :

1)父类 静态方法

2)子类静态方法

3)父类 静态块/属性(块与属性的初始化先后是根据书写顺序来定的)

4) 子类 静态块/属性

5) 父类 方法

6) 父类 块/属性

7) 父类 构造器

8) 子类 方法 /**/

9) 子类 块/属性

10) 子类 构造器

PS:初始化顺序可以写代码去测试,方法是在块,方法,构造器中加入 标准化输出语句,可加上对属性值的输出,在主方法里构造该类的对象。通过结果判断。这里有个比较有难度的测试 子类在构造时,其块和属性真就是在父类构造方法后吗? 这个测试利用到了多态的特点,可以在这里先思考一下,说明完多态后,再把这个测试方法放出。<a
href="#anw">答案</a>

多态 面向对象程序设计的重要组成部分

面向对象程序设计的组成部分。多态和面向对象其他技术(抽象类/类的继承,接口的实现)混合在一起,它不单独存在。也就是说同数据抽象及继承技术结合使用的。能多态的概念简单地说就是一个事物可以完成多项功能。一般为用一个基类(接口)的引用指向一个派生类的对象,用看起来同样的一个事物(基类,接口)来调用相同的特性产生不同的行为能力。

例如在一个类Shape中写了构造方法与draw()方法。再定义三个类Triangle,Circle,Squar都继承自类Shape,在这三个类中写了构造方法以及重写了draw()方法。这时声明一个Shape类的引用shape ,shape = new
Triangle()时,调用shape.draw();方法会发现执行了Triangle中的draw()方法,其他两个同样。这就引出一个概念:方法的重写(覆写)注意有些书上写成了方法的重载,这是不对的,因为方法的重载是另一个概念。

方法的覆写(Override)

方法的覆写,简单的说是,子类继承了父类的某个行为动作后,将其动作改变,可以理解为进化。很明显,方法重写,覆写是把原来的方法盖掉,用新写的方法。这里原方法与新写方法是同一个方法。注意静态方法的重写,是盖掉了原方法,但是两方法不是同一方法。因为所占的内存空间不同。

区别与方法重载,方法的重写有继承技术使用为前提的。方法的重写关注的几个特点,方法名必须相同,新方法访问权限不能较原方法有所缩小。抛出异常范围不能扩大。返回值类型需要相同。

补充概念
方法的重载(Reload)

方法的重载,是说同一个类中,当然也可在子类中重载方法。可以有两个同名但不同操作的方法。理解上,两个方法互相重载,两者不是同一个方法。其实另一个方法起别的名字也行,只是因为起了相同名字,所以需要重载。

区别于方法的重写,方法的重载关注的是:方法的名字是否相同(不同名的两个不同方法自不用重载了),参数的个数,类型,顺序。其实在去想象一下方法的调用即可明白。我们调用方法时写的就是方法的名字,参数。只要不相同就是调用了不同的方法。而因为两个不同的方法名字相同了,所以叫方法的重载。

<a name="anw"/> 了解了方法的重写后,就能想到算法来解决测试子类实例化时的子类新属性初始化是否在父类的构造方法之后了。在父类写一个方法 例如方法 doSth(); 然后在父类构造器中调用该方法。子类中覆写方法doSth();内容为向标准化输出写子类的属性myNewPro.myNewPro声明为:private
int myNewPro = 7; 而在new一个子类的对象时发现 输出的值是0. 这就是因为在运行父类构造方法时,调用了当前对象(子类对象)doSth()方法,子类属性还没有初始化造成的。从而推出子类属性是在父类构造器之后初始化的。

抽象类与抽象方法

接口

PS:非私有非静态方法不能被任何静态方法覆写,如果子类中试着以静态方式(不管访问权限修饰符是什么)来覆写父类的方法,编译时会报错。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐