`
xvm03
  • 浏览: 140767 次
  • 来自: ...
社区版块
存档分类
最新评论

java面向对象浅析系列1

阅读更多

java面向对象浅析系列1——三个基本特征

 

 

众所周知,面向对象的三个基本特征是封装、继承和多态。

笔者所理解的封装是指将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为,而这个公布也是可以有选择性的公布给其它对象。在java中能使用private、protected、public三种修饰符或不用(即默认defalut)对外部对象访问该对象的属性和行为进行限制。

笔者认为继承是子对象可以继承父对象的属性和行为,亦即父对象拥有的属性和行为,其子对象也就拥有了这些属性和行为。这非常类似大自然中的物种遗传。

封装和继承一般比较容易理解,而多态则不容理解,很容易理解错或者混淆概念。下面主要谈一谈笔者对多态的理解。

谈到多态,就需要先提到一些词汇,诸如重载、过载、覆盖、重写等等。笔者不对这些词汇的含义进行分析,而且对多态中的内容,每个人都会有自己的理解,而且也都有各自的习惯叫法,正所谓仁者见仁,智者见智。因为笔者在工作和学习中主要是使用java,因此笔者更倾向于使用java中的固定用法,即overriding(覆盖)和overload(过载)。多态则是体现在overriding(覆盖)上,而overload(过载)则不属于面向对象中多态的范畴,因为overload(过载)概念在非面向对象中也存在。

overload(过载)是指可以编写相同名称但不同形式的函数,C语言中也有这种特性,而C语言是面向过程不是面向对象的。overload(过载)要求不同形式的同名函数必须有不相同的参数列表,不同的参数列表包括参数的类型不一致、参数个数不一致、不同类型的参数的顺序不一致。而如果参数列表相同仅仅是函数返回值类型不一致则是非法的,因为编译器可能无法判断应该使用哪个返回类型的函数。请看以下示例:

         有以下两个函数原型:

                    int count();

                    double count();

         程序中可以有以下几种方式调用:

             1.  int iCount = count();

             2.  double dCount = count();

             3.  count();

         在上面的1和2的调用示例中,编译器似乎能够判断出应该调用的函数从而做出正确的选择,然而很显然,对于3的调用编译器就无能为力了,而3的写法是完全合法并且实际上也会经常用到。

overriding(覆盖)是笔者所认为的面向对象中的多态,因为overriding(覆盖)是与继承紧密联系,是面向对象所特有的。多态是指父对象中的同一个行为能在其多个子对象中有不同的表现。也就是说子对象可以使用重写父对象中的行为,使其拥有不同于父对象和其它子对象的表现,这就是overriding(覆盖)。这种特性非常类似大自然遗传中的变异,变异使得大自然变得丰富多彩,而多态使面向对象富有魔力。下面通过一个具体示例来体会一下多态的魔力。

            有一个父类A:

                  public class A {

                          public void methodA() {

                                  System.out.println("This is Parent of A.");

                          }

                  }

            父类A有以下三个子类:

                  public class B1 {

                          public void methodA() {

                                  System.out.println("This is Children of B1.");

                          }

                  }

                  public class B2 {

                          public void methodA() {

                                  System.out.println("This is Children of B2.");

                          }

                  }

                  public class B3 {

                  }

             上面的子类B!和B2都重写了父类A的方法methodA,而B3则没有。下面我们用实际的调用语句看一看。

              1.    A a1 = new A();

              2.   A a2 = new B1();

              3.    A a3 = new B2();

              4.    A a4 = new B3();

              5.    a1.methodA();

              6.    a2.methodA();

              7.    a3.methodA();

              8.    a4.methodA();

              以上语句的运行结果会如下:

                    This is Parent of A.

                    This is Children of B1.

                    This is Children of B2.

                    This is Parent of A.

             从上面的运行结果可以看到,第五行是指向父类对象实例的引用调用方法methodA,执行也是父类的方法;第六、七行虽然是用类A的对象引用调用方法methodA,但是由于对象引用是指向相应的子类对象的实例,程序正确执行了子类的方法,并没有产生歧义;第八行是指向子类对象B3的实例的引用调用方法methodA,而由于子类B3没有对方法methodA进行overriding(覆盖),也就是直接继承了父类的行为,所以执行结果与第五行一样。从这里我们能够轻易体会到多态的魔力。

 

分享到:
评论

相关推荐

    浅谈java面向对象和引用

    浅谈java面向对象和引用,初学java的一些疑惑点

    浅析面向对象语言C_与Java区别_王艳娟1

    浅析 面回对象 语言 C + + 与 J a v a 区别济南职 业 学院王艳娟【摘要 ]随 着人们 对信 息 需 求的 不 断 变 化, 计算机语言 经 历

    Java 反射机制浅析

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;...它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

    浅析Java抽象类和接口的比较

    abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。

    JS面向对象编程浅析

    在AJAX兴起以前,很多人写...但是自从AJAX兴起后,大量的JS代码编写要求人们具备像写JAVA类似的代码一样,能够面向对象进行开发。 所以下面就结合我自己的体会和所学习的东东和大家一起来学习在JS中如何使用面向对象的

    浅析JAVA异常处理机制.pdf

    异常处理是Java语言的重要机制,正确、合理地处理异常对系统的健壮性和稳定性提供了强有力的支持。异常的处理主要包括捕捉异常、程序流程的跳转和异常处理语句块的定义等。

    JavaScript 和 Java 的区别浅析

    基于对象和面向对象Java是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象。JavaScript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象(Object Based)和...

    Java程序与C语言的区别浅析

    Java程序是面向对象的一种简单、分布式 、解释、健壮、安全、结构中立、可移植、高效能、多线程、动态的语言它是面向对象而C语言是面向过程的,这是最大的不同,对于学过C语言的我们来说,Java可以说是比较简单的...

    浅析在javascript中创建对象的各种模式

    虽然从技术上讲,javascript是一门面向对象的语言,但是javascript没有类的概念,一切都是对象。任意一个对象都是某种引用类型的实例,都是通过已有的引用类型创建;引用类型可以是原生的,也可以是自定义的。原生的...

    java7源码-java-nio-master:Java

    java7 源码 java-nio-master java Nio 主要内容: (1) 按操作方式分类结构图: (2)按操作对象分类结构图 ...1)IO是面向流的,NIO是面向缓冲区的; 2)IO流是阻塞的,NIO流是不阻塞的; 3)NIO有选择器,而

    浅析php单例模式

    设计模式不是Java的专利,我们用面向对象的方法在PHP里也能很好的使用23种设计模式。 那么我们常说的架构、框架和设计模式有什么关系呢? 架构是一套体系结构,是项目的整体解决方案;框架是可供复用的半成品软件,...

    浅析JavaScript原型继承的陷阱

    JavaScript和其它面向对象语言一样,对象类型采用引用方式。持有对象的变量只是一个地址,而基本类型数据是值。当原型上存储对象时,就可能有一些陷阱。 先看第一个例子 代码如下:var create = function() { ...

    软件工程与软件测试自动化教程

    3. 8 面向对象的软件测试 3. 8. 1 在OO语境中的单元测试 3. 8. 2 在OO语境中的集成测试 3. 8. 3 在OO语境中的确认测试 第4章 软件测试用例的设计 4. 1 黑盒测试法和测试用例的设计 4. 1. 1 等价类划分 4. 1. ...

    浅析Python装饰器以及装饰器模式

    在面向对象中,装饰模式指:动态地给一个对象添加一些额外的职责。就增加一些功能来说,装饰模式比生成子类更为灵活。 在设计模式学习—-装饰器模式,我摘取了下面一段使用装饰器模式的代码 public class De

    asp.net知识库

    ASP.NET 2.0 异步页面原理浅析 [1] [原] 自定义通用System.Web.UI.IHierarchicalDataSource简单实现 在 ASP.NET 2.0 中创建 Web 应用程序主题 ASP.NET 2.0 中的数据访问 ASP.NET 2.0:弃用 DataGrid 吧,有新的网格...

    代码之美(中文完整版).pdf

    第26章 节省劳动的架构:一个面向对象的网络化软件框架 26.1 示例程序:日志服务 26.2 日志服务器框架的面向对象设计 26.3 实现串行化日志服务器 26.4 实现并行日志服务器 26.5 结论 第27章 以REST方式集成业务伙伴 ...

    VC与Labview、Matlab编程论文资料[2].rar

    VC_和Excel对象接口的研究与应用.pdf VC_和Matlab混合编程的语音识别研究.pdf VC_实现Excel操作自动化的方法研究与应用.pdf VC_实现MSC_Patran二次开发的方法研究.pdf VC_平台下的虚拟仪器应用研究.pdf VC_环境下...

    VC与Labview、Matlab编程论文资料

    VC_和Excel对象接口的研究与应用.pdf VC_和Matlab混合编程的语音识别研究.pdf VC_实现Excel操作自动化的方法研究与应用.pdf VC_实现MSC_Patran二次开发的方法研究.pdf VC_平台下的虚拟仪器应用研究.pdf VC_环境下...

    VC与Labview、Matlab编程论文资料[4].rar

    VC_和Excel对象接口的研究与应用.pdf VC_和Matlab混合编程的语音识别研究.pdf VC_实现Excel操作自动化的方法研究与应用.pdf VC_实现MSC_Patran二次开发的方法研究.pdf VC_平台下的虚拟仪器应用研究.pdf VC_环境下...

Global site tag (gtag.js) - Google Analytics