㈠ 谈谈你对面向对象的理解
浅谈对面向对象的理解
为什么要使用面向对象的思想来看待问题?
1.面向对象更利于我们看待问题,它使得我们看待问题变得清晰化。对于问题我们只需要了解问题所牵扯到的对象有哪些,它们在这个问题中都有着哪些行为即可。
2.面向对象最大的改变应该是我们看待问题高度发生改变。在利用面向过程的思想看待问题时只是关注程序的变量,语句,表达式的合理性,关注代码块的功能。而利用面向对象的思想进行设计时,我们只需关注对象与对象之间关系。而具体的实现细节是由对象的方法来实现的。但并不是说面向过程就一无是处,对于对象里的方法还是要利用面向过程的思想的。
面向对象的特性
继承是面向对象编程思想中重要的一部分。简单的讲就是从一个已有的类中派生出新的类。来实现一些父类没有的功能。父类允许子类继承它的方法,如果父类中有些方法和子类中的方法发生冲突,子类可以重写该方法。子类也可以实现父类的所有功能。对于基类的设计过程,我们应该根据实际情况包含各种可能性。比如说有一个狗的类,任何一个品种的狗都可以继承它,去实现自己细节。但如果要实现猫的行为方式,显然狗这个类就不适合了,应该在往上走,去实现一个动物的类,就可以继承这个类来实现猫的行为属性。这样做的目的是使程序具有较高的可扩展性。继承的优点是,提高代码的复用性,降低工作量。缺点是,如果父类的大部分功能子类都用不上,那么子类就显得比较冗余了。
面向过程的实现过程就是变量在函数之间的不断传递,使得函数之间进行信息的交流来实现编程的需要的。这样的后果就是如果变量在某一函数中被改变了,会导致整个程序出错。对于面向对象来说,信息之间的交流是以对象做为参数的,调用的类只能使用该类的某些功能来实现自己的功能。里面的信息对外界来说是不可见的,也无法改变类中的属性。因为类中的属性大多都是私有的或保护的。这就体现了封装性,封装是将属性和方法“打包”,属性私有化或保护化,方法公有化,只能使用该类的方法来使用和改变该类的属性。就好像人一样,比如吃饭是一个方法,那么吃多吃少是自己的事,与别人无关。别人也不可能改变这个事实。
对于面向对象来说,类相当于一个模板,一个抽象的概念,对象才是类的实例化体现,即是程序代码的组成部分。对于继承了父类的多个子类而言,重写了父类的某些方法,方法名虽然相同,方法体不同,实现过程不同,即不同子类的该方法不同。使用父类类型定义的子类对象。调用不同子类的方法,产生的了不同结果,这种变化就叫多态性。尤其对于父类是抽象类来说,由于父类中的方法未定义,不同子类继承父类后,可以重写父类的方法。抽象类不能实例化对象,只能被继承,一般作为基类。
面相对象的原则
一.单一原则
就一个类来说,类的功能应该较为单一一点,不应该是各种功能都包含在一起,这样不利于代码的维护,容易产生BUG,也破坏了类的本质。应该是类中的所有方法都为某一功能服务。但并不是类分的越详细越好,根据实际情况而定。
二.开闭原则
对于一个类来说,应该是扩展是开放的,修改是关闭的。随着人们的对软件功能的不断期待和改变,我们总是避免不了的要在原有的代码的基础上进行变化,但我们不可能对原有的代码进行修改,因为这可能使原有出现BUG,所以扩展是理所当然的。这个就要通过继承来实现了。
三.迪米特原则
一个类应该降低对其它类的耦合度,如果避免不了要与其它类产生关联的话,应该避免对其它类的了解。保持类的封装性特点。如果两个类之间耦合度较高的话,一个类的改变会影响另一个类,而面向对象的原则是程序之间的类应该是很少关联的各个类执行自己的功能就好。
对象之间的关系
泛化关系是对象之间耦合度最大的一种关系,就是继承关系。在java中接口就类似于抽象类,它是方法说明的集合,子类继承接口,并实现接口中的方法,就是实现关系。在程序中,有时候避免不了的要把某一个对象做为参数,局部变量,返回值,让另一个对象调用完成该类的某些功能。这就是依赖关系。聚合关系是整体包含局部的概念。例如班级与学生之间的关系。组合关系是一种强烈的包含关系。例如学校和班级之间的关系,公司和部门之间的关系。聚合关系和组合关系的区别就在于,聚合关系中的的局部可以独立存在,例如这个班级被取消了,不能说明班里的学生就不是学生了。组合关系而言,整体的生命周期和局部的生命周期是息息相关的,如果整体不存在了,局部肯定不存在了,例如公司倒闭了,那么它其中的某一个部门肯定也不会存在。
总结
所谓面向对象编写的程序,就是通过不同对象的实现来实现整个功能。重点还是如何合理的设置对象,以及对程序的包容性,即你要考虑将来可能会改变某一功能或添加某一功能。对程序的升级。还有就是在满足程序功能的前提下保持低耦合度。
㈡ JAVA面向对象六大原则是什么
1) Open-Close Principle(OCP),开-闭原则,讲的是设计要对扩展有好的支持,而对修改要严格限制。这是最重要也是最为抽象的原则,基本上我们所说的Reusable Software既是基于此原则而开发的。其他的原则也是对它的实现提供了路径。
2) Liskov Substituition Principle(LSP),里氏代换原则,很严格的原则,规则是“子类必须能够替换基类,否则不应当设计为其子类。”也就是说,子类只能去扩展基类,而不是隐藏或覆盖基类.
3) Dependence Inversion Principle(DIP),依赖倒换原则,“设计要依赖于抽象而不是具体化”。换句话说就是设计的时候我们要用抽象来思考,而不是一上来就开始划分我需要哪些哪些类,因为这些是具体。这样做有什么好处呢?人的思维本身实际上就是很抽象的,我们分析问题的时候不是一下子就考虑到细节,而是很抽象的将整个问题都构思出来,所以面向抽象设计是符合人的思维的。另外这个原则会很好的支持OCP,面向抽象的设计使我们能够不必太多依赖于实现,这样扩展就成为了可能,这个原则也是另一篇文章《Design by Contract》的基石。
4) Interface Segregation Principle(ISP),“将大的接口打散成多个小接口”,这样做的好处很明显,我不知道有没有必要再继续描述了,为了节省篇幅,实际上我对这些原则只是做了一个小总结,如果有需要更深入了解的话推荐看《Java与模式》,MS MVP的一本巨作!^_^
5) Composition/Aggregation Reuse Principle(CARP),设计者首先应当考虑复合/聚合,而不是继承(因为它很直观,第一印象就是“哦,这个就是OO啊”)。这个就是所谓的“Favor Composition over Inheritance”,在实践中复合/聚合会带来比继承更大的利益,所以要优先考虑。
6) Law of Demeter or Least Knowlegde Principle(LoD or LKP),迪米特法则或最少知识原则,这个原则首次在Demeter系统中得到正式运用,所以定义为迪米特法则。它讲的是“一个对象应当尽可能少的去了解其他对象”。也就是又一个关于如何松耦合(Loosely-Coupled)的法则。
㈢ 在java中,什么是接口,接口的特点是什么
java接口:
1、Java语言中存在的结构,有特定的语法和结构。
2、Java语言中一个类所具有的方法的特征集合,是一种逻辑上的抽象。
java接口作用:
1、利于代码的规范
这样做的目的一方面是为了给开发人员一个清晰的指示,告诉他们哪些业务需要实现;同时也能防止由于开发人员随意命名而导致的命名不清晰和代码混乱,影响开发效率。
2、有利于对代码进行维护
可以一开始定义一个接口,把功能菜单放在接口里,然后定义类时实现这个接口,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。
3、保证代码的安全和严密
一个好的程序一定符合高内聚低耦合的特征,能够让系统的功能较好地实现,而不涉及任何具体的实现细节。这样就比较安全、严密一些,这一思想一般在软件开发中较为常见。
(3)ocp原则java扩展阅读:
关于java接口的使用规范:
1、接口中可以定义常量,不能定义变量,接口中的属性都是全局静态常量,接口中的常量必须在定义时指定初始值。
2、 接口中所有的方法都是抽象方法,接口中方法都会自动用public abstract 修饰,即接口中只有全局抽象方法。
3、 接口不能实例化,接口中不能有构造。
4、 接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但接口不能继承类。
5、 接口的实现类必须实现接口的全部方法,否则必须定义为抽象类。
参考资料来源:网络:java接口