java语言程序设计信息工程学院1第二章面向对象的基本原则授课教师:杨杰明java语言程序设计信息工程学院2目录1.面向抽象原则2.开-闭原则3.多组合少继承原则4.高内聚-低耦合原则java语言程序设计信息工程学院3课前思考•抽象类的特点及实现方式。•接口的特点及实现方式。java语言程序设计信息工程学院41.面向抽象原则---1.1抽象类特点•抽象类中可以有抽象方法,也可以有非抽象方法•抽象类不能用new运算符创建对象•如果一个子类继承一个抽象类,该子类要么实现父类的所有抽象方法,要么该子类也声明为抽象类。•可以作为上转型对象。java语言程序设计信息工程学院51.面向抽象原则---1.1抽象类示例abstractclassA{publicabstractintadd(inta,intb);}classBextendsA{publicintadd(inta,intb){returna+b;}}publicclassApplication{publicstaticvoidmain(Stringargs[]){Aa=newB();intm=a.add(3,2);System.out.println(m);}}java语言程序设计信息工程学院61.面向抽象原则---1.2接口特点•接口中只可以有public权限的抽象方法,不可以有非抽象方法•接口中的成员变量都默认是共有的和终结类型的•接口不能用new创建对象,必须用类去实现•接口的回调:在接口类型的变量中可以存储实现该接口的类实例的引用,并通过该接口变量来访问类实例的方法。java语言程序设计信息工程学院71.面向抽象原则---1.2接口示例interfaceCom{publicabstractintsub(intx,inty);}classComImpimplementsCom{publicintsub(intx,inty){returnx–y;}}publicclassApplication{publicstaticvoidmain(Stringargs[]){Comcom=newComImp();intm=com.sub(8,2);System.out.println(m);}}java语言程序设计信息工程学院81.面向抽象原则---1.3面向抽象–指当设计类时,不让该类面向具体的类,而是面向抽象类或接口,即所设计类中重要数据是抽象类或接口的变量,而不是具体类的变量。圆柱体java语言程序设计信息工程学院91.面向抽象原则---1.3面向抽象示例1.publicclassCircle{2.doubler;3.publicCircle(doubler){4.this.r=r;5.}6.publicdoublegetArea(){7.returnMath.PI*r*r;8.}9.}1.publicclassPillar{2.Circlebottom;3.doubleheight;4.publicPillar(Circlebottom,doubleheight){5.this.bottom=bottom;6.this.height=height;7.}8.publicdoublegetVolume(){9.returnheight*bottom.getArea();10.}11.}问题:如果用户不需要圆柱体,而是底为三角形或矩形的柱体怎么办呢?:java语言程序设计信息工程学院101.面向抽象原则---1.3面向抽象示例改进1.publicabstractclassGeometry{2.publicabstractdoublegetArea();3.}1.publicclassPillar{2.Geometrybottom;3.doubleheight;4.publicPillar(Geometrybottom,doubleheight){5.this.bottom=bottom;6.this.height=height;7.}8.publicdoublegetVolume(){9.returnheight*bottom.getArea();10.}11.}柱体的底为一个抽象类java语言程序设计信息工程学院111.面向抽象原则---1.3面向抽象示例改进1.publicclassCircleextendsGeometry{2.doubler;3.publicCircle(doubler){4.this.r=r;5.}6.publicdoublegetArea(){7.returnMath.PI*r*r;8.}9.}1.publicclassRantangleextendsGeometry{2.doublea,b;3.publicRantangle(doublea,doubleb){4.this.a=a;this.b=b;5.}6.publicdoublegetArea(){7.returna*b;8.}9.}柱体的底为圆柱体的底为矩形java语言程序设计信息工程学院122.开-闭原则•设计应当对扩展开放,对修改关闭。•如果遵守了“开-闭原则”,那么这个设计一定是易维护的,因为在设计中增加新的模块时,不必去修改设计中的核心模块。java语言程序设计信息工程学院133.多组合少继承---继承的优缺点•继承的优点–子类可以继承父类的方法–子类可以重写父类的方法•继承的缺点–子类继承父类的方法在编译的时候就确定了,在运行期不能改变从父类继承的行为–子类和父类之间是强耦合关系,父类行为变化必然导致子类行为发生变化–通过继承进行的复用也称“白盒”复用,父类的内部细节对于子类是完全可见的。java语言程序设计信息工程学院143.多组合少继承---组合的优缺点•组合:–一个类可以将其他类对象作为自己的成员变量,从而调用这些对象的方法。•组合的优点–通过组合的复用也称为“黑盒”复用,因为当前对象只能委托其包含的对象调用它们的方法,但方法的实现细节不可见–当前对象和被包含对象的关系是弱耦合关系,因为修改当前对象包含的对象的代码,不必修改当前对象的代码、–当前对象可以在运行时改变其包含的对象•组合的缺点–导致对象过多–为了能够组合多个对象,必须仔细地对接口进行定义java语言程序设计信息工程学院153.多组合少继承•设计中避开类继承的缺点•充分使用对象组合的优点。java语言程序设计信息工程学院164.高内聚-低耦合原则•高内聚–如果类中的方法是一组相关的行为,则称该类是高内聚的,反之称为低内聚的。•低耦合–所谓低耦合就是尽量不要让一个类含有太多的其它类的实例的引用,以避免修改系统的其中一部分会影响到其它部分。java语言程序设计信息工程学院17练习题1.继承和接口的特点及Java实现的方法。2.掌握面向抽象的思想。3.方法复用常用的技术有哪两种?4.继承的优缺点。5.组合的优缺点。