java基础篇(三) ----- java面向对象的三大特性之多态

封装(encapsulation)

类使得数据和对数据的操作捆绑在一起,从而对使用该类的其他人来说,可以不管它的实现方法,而只管用它的功能,从而实现所谓的信息隐藏;

继承(inheritance)

继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。比如可以先定义一个类叫animal,animal具有以下属性:   眼睛,鼻子,耳朵 而又由animal这个类派生出dog和cat两个类,为dog添加一个看家的功能,而为cat添加一个抓鱼的功能。

如果两个类存在is-a关系就可以使用继承,同时继承也为实现多态做了铺垫。那么究竟什么是多态?多态的实现机制是怎么样的?

其实所谓的多态是一个程序中同名方法但功能不同,允许不同类的对象对同一消息作出响应,它是面向对象中最重要的感念之一

多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。

通俗的解释多态就是,假如有个方法名叫:“动物的叫声” 那么,当你传递的参数是动物狗,则调用狗叫声,是猫,则调用猫叫声,这就是多态。

以下介绍两个很形象的例子

引自:http://www.cnblogs.com/qinqinmeiren/archive/2011/07/15/2151687.html

比方一下:

你和你朋友都是烟鬼,

某日,你没有带烟, 而你朋友有n种烟,

你说: 来根烟,

朋友给你一根;

你通过烟的过滤嘴, 品出为白沙烟

你再要一根,

品出这次是芙蓉王,

再要一根,

品出这次是熊猫

...

上面描述的就是多态!

烟 a = 白沙
烟 b = 芙蓉王
烟 c = 熊猫

.............

这里所表现的的就是多态。白沙、芙蓉王、熊猫都是烟的子类,我们只是通过烟这一个父类就能够引用不同的子类,这就是多态——我们只有在运行的时候才会知道引用变量所指向的具体实例对象。

Yan a = new BaiSha();

这里我们这么理解,我们定义了一个Yan类型的a,由于BaiSha是继承Yan的,所以BaiSha可以自动向上转型为Yan,所以a是可以指向BaiSha的实例的,这样做有个强大的好处,就是我们知道子类是父类的扩展,拥有比父类更加强大的功能,如果我们敌营一个指向子类的父类的引用。不但可以使用子类的共性,还可以使用子类的强大功能。但是世间万物没有完美的,向上转型存在一丝缺憾,他会导致一些属性和方法丢失。导致我们不能获取他们,所以我们定义父类类型的引用可以调用父类中已经定义的属性和方法,对于那些只在子类中存在的属性和方法就望尘莫及了、、、

再举一个鸡的例子:
鸡是所有其它鸡的基类, 定义了一个方法shape(), 此方法能指明鸡的形态. 所有的子类[火鸡,山鸡,田鸡等],都有这个shape方法, 表明自己的形态,

如果用下面的方法定义我需要具体的鸡,

[基类 引用 = 实现类的对象]

for example:

鸡 a = new 火鸡();

鸡 a = new 田鸡();

鸡 a = new 山鸡();

鸡 a = new 母鸡();

当我使用的时候, 我采用 a 这个引用,

a.shape(), 就会得到鸡的形态.

如果我定义的是

鸡 a = new 火鸡();

那么a.shape得到的是火鸡的形态, 而不需要用具体的

火鸡 a = new 火鸡(); 再通过a.shape得到火鸡的形态

----------------------------------------------------------------------------------

java多态的一个经典实例:

引自:http://blog.csdn.net/thinkGhoster/article/details/2307001

class A ...{
         public String show(D obj)...{
                return ("A and D");
         } 
         public String show(A obj)...{
                return ("A and A");
         } 

class B extends A...{
         public String show(B obj)...{
                return ("B and B");
         }
         public String show(A obj)...{
                return ("B and A");
         } 
}
class C extends B...{} 
class D extends B...{}

(二)问题:以下输出结果是什么?

        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C(); 
        D d = new D(); 
        System.out.println(a1.show(b));   ①
        System.out.println(a1.show(c));   ②
        System.out.println(a1.show(d));   ③
        System.out.println(a2.show(b));   ④
        System.out.println(a2.show(c));   ⑤
        System.out.println(a2.show(d));   ⑥
        System.out.println(b.show(b));     ⑦
        System.out.println(b.show(c));     ⑧
        System.out.println(b.show(d));     ⑨

(三)答案

①   A and A
              ②   A and A
              ③   A and D
              ④   B and A
              ⑤   B and A
              ⑥   A and D
              ⑦   B and B
              ⑧   B and B
              ⑨   A and D

①②③比较好理解,一般不会出错。④⑤就有点糊涂了,为什么输出的不是"B and B”呢?

首先我们要知道,当超类对象引用变量引用了子类对象时,是被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。这句话对多态进行了一个概括

其实在继承链中对象方法的调用存在一个优先级: this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

遵循上述对象方法调用的优先及我们不难发现此处的原因!

对象多态性主要分两种类型:

(1)向上转型,子类对象向父类对象转型时,java系统会自动完成。

(2)向下转型, 父类对象向子类对象转型时,必须要明确指明要转型的子类类型。

java实现多态需要:(1)继承(或给予接口实现) (2)重写 (3)父类的引用指向子类的对象!!

本人学习总结所用,如有纰漏错误之处请指正,定虚心学习改正!谢谢。

不为失败找借口,只为成功找方法!!!!

时间: 2024-08-27 12:14:10

java基础篇(三) ----- java面向对象的三大特性之多态的相关文章

面向对象的三大特性之多态

# 面向对象的三大特性之多态 # 多态 由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同 # 多态的概念指出了对象如何通过他们的属性和动作来操作及访问,而不需要考虑他们具体的类 # 多态表明了动态(运行时)绑定的存在,允许重载及运行时类型确定和验证 # 多态是由同一个类实例化出的多个对象,这些对象执行方法时,执行的过程和结果是不一样的 class H2O: # 定义了一个水的基类 def __init__(self, name, temp): # 初始化实例属性 self.name =

java基础篇(二) ----- java面向对象的三大特性之继承

java面向对象的三大特性之继承: 复用代码是java众多引人注目的功能之一,但是想要成为极具革命性的语言,仅仅是复制代码并对其加以改变是不够的.它必须能够做更多的事.引自<Think in java>    而代码复用也是程序员一直不断追求的.由此来说下代码复用的一种方式 java面向对象的三大特性--继承!! 在面向对象程序设计中,继承机制可以有效地组织类的结构.确定类之间的关系,在已有类的基础上开发新的类.继承机制在程序代码复用.提高软件开发效率.降低软件系统维护成本等方面具有重要作用.

java基础篇(一) ----- java面向对象的三大特性之封装

java面向对象的三大特性之封装:   封装(Encapsulation)是面向对象的一个重要特征,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节. 通俗的讲所谓封装就是将属性和方法捆绑到一起,封装到一个对象中去, 形成一个不可分割的独立单位,以及尽可能隐藏对象的内部结构,也就是说,如果我们使用了封装技术的话,别人就只能用我们做出来的东西而看不见我们做的这个东西的内部结构了. 如果形容一个人(假设把人看做一个类),我们可以用姓名.年龄,性别等来描述,如果不封

JAVA基础篇三(Java,C++中的异常机制)

由于C++和JAVA有很多相似之处,又有很多细微的差别,所以在学习JAVA的过程中对两种语言进行对比学习. 1.C++的异常机制 C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理.如此逐级上传,直到最高一级还无法处理的话,运行系统会自动调用系统函数terminate,由它调用abort终止程序.这样的异常处理方法使得异常引发和处理机制分离,而不在同一个函数中处理.这使得底层

OC基础(五)面向对象的三大特性:封装、继承、多态

一.封装: 封装是屏蔽内部实现的细节, 仅仅对外提供共有的方法/接口 好处: 保证数据的安全性,将变化隔离 规范: 一般情况下不会对外直接暴露成员变量, 都会提供一些共有的方法进行赋值成员变量都需要封装起来 注:1.若一个类把自己的成员变量暴露给外部的时候,那么该类就失去对该成员变量的管理权,别人可以任意的修改你的成员变量. 2.封装中经常使用@property(即setter和getter方法) 3.在类的延展中对类进行分装,即: @interface NSObject () @end 二.继

java基础篇---I/O技术(三)

接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream).使用对象输出流输出序列化对象的步骤,有时也成序列化,而使用对象输入流读入对象的过程,有时也称为反序列化 一个对象产生之后实际上是在内存中为其开辟了一个存储空间,方便存储信息. 对象序列化就是把一个对象变成二进制的数据流的一个方法,通过对象序列化可以反驳的

java基础笔记(6)----面向对象的三大特性

简介:面向对象的三大特性就是封装,继承,多态,是面向对象的核心. 封装 简介:封装是类的边界,可以对数据起到保护作用 特性:属性私有,提供公开的get/set方法 属性私有:private 数据类型 变量名:---->private修饰的属性只能在本类使用 公开的get/set方法 public修饰---- >在任何类中都可以使用 get方法:----获取属性的值 public 数据类型 getXxx(){ return this.属性名 } set方法:----修改属性的值 public v

Java基础—面向对象的三大特性

面向对象有三大特性分别是继承.封装和多态. (1)继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派生类可以从它的基类那里继承方法和实例变量,并且子类可以修改或增加新的方法使之更适合特殊的需要. (2)封装:封装是指将客观事物抽象成类,每个类对自身的数据和方法实行保护.类可以把自己的数据和方法只让可信的类或者对象

[Java 05 OO] (基础篇) 《Java开发实战经典》

p5OO 第五章 面向对象 (基础篇) Notes (1), Constructor / this / String   String str1 = "hello"; 解释 : 是把一个在堆内存空间的使用权给了 str1 对象.   String str2 = "hello"; str1 == str2 是 true   String 字符串的内容不可改变 (2), Java 常用的内存区域    1), 栈内存空间    2), 堆内存空间    3), 全局数据