您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > Java《抽象类》.
抽象类主讲:梅志阶本次课内容了解抽象的概念理解抽象类概念及创建抽象类和接口的区别访问修饰符(publicprotecteddefaultprivate)内部类抽象从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。例如苹果、香蕉、生梨、葡萄、桃子等,它们共同的特性就是水果。得出水果概念的过程,就是抽象的过程。要抽象,就必须进行比较,没有比较就无法找到共同部分。抽象处理事物复杂性的方法只关注事物的重要细节,而忽略事物的次要细节。为什么要抽象为什么要抽象递交报告速递公司在回执确认上签名返回回执确认史密斯大夫将报告送往目的地包装并密封报告abstract修饰抽象类和抽象方法classA{voidfun1();voidfun2(){System.out.println(thisisa+concretemethod);}}abstractabstract抽象类与抽象方法含有抽象方法的类肯定是抽象类,但抽象类不一定必须包含抽象方法例:fun2()就有实现和不能被声明为抽象方法抽象方法只需声明,而不需实现static方法构造函数求面积问题–难以在父类中写出每种图形的面积方法–不能在子类中单独实现,否则父类不能使用解决:–父类中声明、子类中实现求面积求面积求面积图形类8publicabstractclassShape{publicStringshapeName;/**默认构造方法*/publicShape(){}/**参数化构造方法*/publicShape(StringshapeName){this.shapeName=shapeName;}/**抽象方法:求面积*/publicabstractdoublegetArea();/**已实现方法:介绍*/publicvoidshowShape(){System.out.println(正在操作的图形为:+shapeName);}}10publicclassCircleextendsShape{publicdoubleradius;//半径publicstaticfinaldoublePI=3.14;/**默认构造方法*/publicCircle(){}/**参数化构造方法*/publicCircle(StringshapeName,doubleradius){super(shapeName);this.radius=radius;}/**圆环面积*/publicdoublegetArea(){System.out.println(圆环面积为:+PI*radius*radius);returnPI*radius*radius;}}publicclassRectangleextendsShape{publicdoublewidth;publicdoublelength;/**默认构造方法*/publicRectangle(){}/**参数化构造方法*/publicRectangle(StringshapeName,doublewidth,doublelength){super(shapeName);this.width=width;this.length=length;}/**实现父类抽象方法:求长方形面积*/publicdoublegetArea(){System.out.println(长方形面积为:+width*length);returnwidth*length;}}12publicabstractclassTriangleextendsShape{publicdoubleborder;publicdoubleheight;/**默认构造方法*/publicTriangle(){}/**参数化构造方法*/publicTriangle(StringshapeName,doubleborder,doubleheight){super(shapeName);this.border=border;this.height=height;}//抽象方法未实现//publicabstractdoublegetArea();}13子类必须覆盖所有抽象方法才能被实例化,否则这个子类还是个抽象类。含有abstract方法的类必须用abstract来修饰(即使不含抽象方法,类也可以被声明为抽象类)。abstract类只关心它的子类是否具有某种功能,并不关心功能的具体行为,功能的具体行为由子类负责实现,所以抽象类可以实现类型隐藏。抽象类不能实例化,即不能用new关键字去产生对象。抽象类的变量必须指向它的非抽象子类的对象。抽象方法只需声明,而不需要实现不能定义一个既是final的又是abstract的类,因为这是自相矛盾的。抽象类与compareTo()方法我告诉你比较标准,你来帮我排序例如:如果用抽象类,实现一个对数组元素的排序算法。1.该数组中的每一个元素都是对象。2.各元素之间有比较的标准。(可比性)abstractclassMyComparable{publicabstractintcompareTo(MyComparableb);}定义比较标准:如当前类小于目标类,返回负数如当前类大于目标类,返回正数如当前类等于目标类,返回0覆盖compareTo()方法publicclassRectangleextendsMyComparable{publicintcompareTo(MyComparableobj){floata=this.calculateArea();//当前圆面积floatb=((Rectangle)obj).calculateArea();//另一个圆的面积if(ab)return-1;elsereturn1;}…}覆盖compareTo(),比较当前对象和另一个对象抽象类接口相同对象不能直接实例化,通过多态性,可以由其子类实例化不相同包含一般方法、抽象方法、常量、变量包含常量或抽象方法可以由构造方法不能有构造方法抽象类可以实现多个接口接口不能继承一个抽象类继承时,单继承会有局限解决单继承带来的局限从开发上讲:优先使用接口,因为接口运行多继承希望晚辈实现我的愿望未完成长辈遗愿,希望晚辈完成接口抽象类具体类在Java中,继承体现的是“isa”的关系,而接口体现的则是“hasa”聚合的含义接口(interface)是特殊的“抽象类”在接口中,所有的方法都必须是抽象的,通常定义一组公用的未实现的方法publicclassDoor{publicvoidguard(){/*门的作用*/System.out.println(门负责防护!);}}publicclassMyDoorextendsDoorimplementsBell,Lamp{publicvoidalarm(){/*实现alarm方法*/System.out.println(当撬门时发出警报!);}publicvoidlight(){/*实现light方法*/System.out.println(开门时壁灯自动亮起,关门后自动关闭!);}}publicinterfaceBell{/*铃的功能*/publicvoidalarm();}publicinterfaceLamp{/*点灯*/publicvoidlight();}20访问修饰符是方法或属性的限定符,决定在什么样的情况下你能够访问(使用)这些方法或属性访问修饰符提高了Java程序的安全性,可以避免代码滥用、访问越界,有效控制程序结构21public,必须定义在和类名同名的文件中,这个类能在任意地方使用。默认,没有加任何访问修饰符,只有在同一个包中的类才能使用packagemypack1;publicclassClassA{publicintvar1;protectedintvar2;intvar3;privateintvar4;publicvoidmethod(){var1=1;//合法var2=2;//合法var3=3;//合法var4=4;//合法ClassAa=newClassA();a.var1=1;//合法a.var2=1;//合法a.var3=1;//合法a.var4=1;//合法}}packagemypack1;classClassB{publicvoidmethod(){ClassAa=newClassA();a.var1=1;//合法a.var2=1;//合法a.var3=1;//合法//编译出错,var4为private类型,不能访问//a.var4=1;}}packagemypack2;importmypack1.ClassA;//编译出错,不能引入ClassBimportmypack1.ClassB;publicclassClassD{publicvoidmethod(){ClassAa=newClassA();a.var1=1;//合法//编译出错,var2为protected类型,不能被访问a.var2=1;//编译出错,var3为默认访问级别,不能被访问a.var3=1;//编译出错,var4为private类型,不能被访问a.var4=1;//编译出错,不能被访问ClassBClassBa=newClassB();}}packagemypack2;importmypack1.ClassA;publicclassClassCextendsClassA{publicvoidmethod(){//合法,ClassC继承了ClassA的var1变量var1=1;//合法,ClassC继承了ClassA的var2变量var2=1;ClassAa=newClassA();a.var1=1;//合法a.var2=1;//编译出错,//编译出错,var3为默认访问级别不能被访问a.var3=1;//编译出错,var4为private类型不能被访问a.var4=1;}}父类的属性和方法private父类的属性和方法ProtectedPublic默认子类的属性和方法Private默认Protectedpublicprivate√默认√√protected√√√public√√√√25private——私有权限默认修饰符(不用修饰符)——家庭权限protected修饰符——家族权限public修饰符——完全开放内部类内部类,是在一个类的内部定义的类。匿名类是一种特殊的内部类。class外部类{…class内部类{…}…}内部类interfaceOuterIFC{voidmethod();}publicclassOuter{publicclassInner1{}//实例内部类publicstaticclassInner2{}//静态内部类privateOuterIFCo=newOuterIFC(){inti=1;voidmethod(){i++;}};//一个实现了OuterIFC接口的匿名类OuterIFCgetInstance(){returno;}voidouterMethod(){classInner3{};//局部内部类Inner3in=newInner3();}}//endofclassOuterclassTester{publicvoidtest(){Outer.Inner1in1=newOuter().newInner1();Outer.Inner1in11=newOuter.Inner1();//非法Outer.Inner2in2=newOuter().newInner2();Outer.Inner2in22=newOuter.Inner2();}}内部类的特性classClassA{privateintvA=0;classB{intvB=vA;}voidmethodA(finalintparam1,intparam2){finalintlocalV=0;classC{intvC;voidmethodC(){intv1C=vA;//合法intv2C=localV;//
本文标题:Java《抽象类》.
链接地址:https://www.777doc.com/doc-2880582 .html