java简述什么是封装性、继承性和多态性
封装性是指的把代码封装到大括号中,只能访问自己内部的数据,外边的东西访问不了.
继承性就是一个类声明继承另一个类,那么另一个类就是它 的父类,父类里边的变量跟方法子类可以直接拿来用,除非父类的访问权限不允许.
多态分为方法的重载和重写,重载是指方法的名和返回类型相同,但是参数不同.重写是指子类继承父类的方法,但是在子类自己类体里边又写了一个方法, 跟父类中的方法名,返回类型,参数列表都完全一样,但是方法体不同,也就是说它有自己的实现方式.这就是重写.
如何理解封装、继承、多态?
面向对象可以说是一种对现实是事物的抽象,将一类事物抽象成一个类,类里面包含了这类事物具有的公共部分,以及我们对这些部分的操作,也就是对应的数据和过程。
面向对象思想的三大特性,我们应该如理解呢?
封装
在面向对象思想中,对一个类,将数据和过程封包围起来,对外隐藏具体的实现细节
并且数据(成员变量和成员函数)在内部是完全自由使用的,而外部对数据的访问是加访问限定的,某些对操作只能根据由内部提供接口。
例如一个日期类,我们将日期的数据和操作放在一个类中,我们知道日期的格式是有严格限制的,构造一个日期类对象必须通过自定义构造函数来完成,我们对日期的操作只能根据类里面提供的接口,不是说可以随意的进行加减乘除操作。
继承
继承可以说是一种代码复用的手段,我们在一个现有类上想扩展出一些东西的时候,不需要再次重复编写上面的代码,而是采用一种继承的思想。在派生出的子类里添加一些我们想要的数据或方法,也可以理解为从一般到特殊的过程。
三种继承关系中,保护继承在派生思想中可能用到,私有继承几乎没有用到过。
共有继承是一种is a的关系,子类对象是一个父类对象,与共有继承相关的组合(该类的数据成员为其他类的对象)可以说是一种has a的关系,该对象中有一个其他对象 .
例如,我们封装一个动物类,当我们想实现一个鸟类的类时,就可以采用继承的思想,鸟类动物是一类动物,动物所具有的特性鸟类动物都具有,就可以用动物类派生出鸟类,当我们想要实现一个更具体的麻雀的类时,麻雀是一种鸟,这一点毋庸置疑,就可以用鸟类派生出麻雀类。
多态
这里先说运行时多态,其实是指在继承体系中父类的一个接口(必须为虚函数),在子类中有多种不同的实现,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。即通过父类指针或者引用可以访问到子类的接口(虚函数),看上去就像是一个相同的动作,会出现多种不同的结果。
就可以理解为,调用接口时,与类型无关(用父类的指针或者引用),与对象有关(父类指针或引用指向不同的对象,而调用到不同的接口)
就可以屏蔽不同子类对象之间的差异(可以将不同的子类对象都当作父类来看),写出通用的代码,做出通用的编程,以适应需求的不断变化。
还有一种是编译时多态,函数重载,正如其名,在静态多态就是在编译期间确定的多态模型。
多态是如何实现,主要还是虚表,只要类里面有虚函数,就会在静态区开辟一块空间来保存虚函数(属于整个类域),每个对象里面都有一个虚表指针,虚表是在编译的时候进行初始化的,虚表指针是在初始化列表中初始化。我们知道用父类的指针可以指向子类对象(发生切片行为),但是虚表是不变的,访问的虚函数就是子类的虚函数了。
你好象发错地方了吧!!这是个编程问题!!!
不过还是给你个答案吧!
继承的好处是代码重用.哲学上讲事物都是有共性和特性的.把共性函数代码放入到父类中,把特性函数代码放入到子类中,当然是否共性要以参照点的标准.OO中所谓的抽象我自己理解为哲学中的共性
在同一个行业中,他们各业务流程往往有很大的相似性,但往往我们都是到一个项目中就重新写一套流程代码,或者粘贴以前的代码.可能有很多代码都是以前写过的重复代码.造成重复劳动.如果采用继承应该这样,首先在父类中做一个基本上大部分行业项目都必要的简洁的主流程.在子类中针对具体项目的特殊性做主流程充分的完善的补充.这样在每个项目中,只针对项目的特殊性编写代码,大大降低重复劳动.当然根据具体流程的复杂多可以划分多的继承层次,呈现一种继承的树结构,但一定的要保证层次一定要有实际的意义.
2,为什么要封装
高内聚低偶合的思想简单的理解同一模块内的提高内聚,不同模块降低偶合.如果说一个类代表一个模块或是一个业务流,那么A类内部要提高内聚,类的属性可以看成是内的局部变量.提高数据的重用.公共函数尽量能被其他主函数,尽量达到功能内聚.如果说是A类和B类,并且是不同模块(也许是同一个模块下的两个子模块),那么B是不能使用A的函数和属性的,紧进行数据偶合.封装的作用就体现在这里.
再现实中就项目中经常遇到这种情况,某项业务增加或修改一种类型的业务流,自己本身调试成功了,但是缺影响了此业务下其他的业务流,不得不测试所有得其他原本正常的业务流并不得不针对此做类型判断的补丁,这种补丁很肯能导致程序结构的不合理.
3.为什么多态
个人认为多态的好处体现在代码的可扩充性,比如一个业务有多个业务流,为了区别不同的类型就的使用判断,那么新添加一个流程就得在过程执行主流程(往往是final,必然是面向过程的)中添加一个”if then”或是重载一个函数
在目前项目中mvc得控制器就是典型的多态.想想如果我们不使用多态那么怎么办?因为对PO对象是新添加的,那么必须针对新的PO对象在代码中做IF判断,才能用他本身的对象类型指向他.造成过程执行主流程不断的要变更自己的代码.
总结:
OO中继承和多态互相依赖又互相矛盾,没有继承就不可能有多态,多态的使用往往又在面向过程的代码中.继承是使子类可以使用父类的功能,而多态使父类能使用子类的功能.
OO并非只是在编码阶段来处理,实际上在概要设计,详细设计,数据库设计的时候就应该OO的思想来设计.提高软件可重用性和可扩充性.对于想对一个行业做标准化产品软件而言,很重要.
找本ThinkInJAVA
或C核心编程!!!对这介绍的很详细!!!!!
面向对象语言!!!
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!