您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > day07抽象类,接口多态
1抽象类为什么使用抽象类1:定义Dog类有颜色属性和叫的方法2:定义Bird类有颜色属性和叫的方法3:定义其父类Animal1:抽取共性颜色属性和叫的方法1:颜色的属性可以使用默认初始化值。2:叫的方法在父类中如何定义?1:狗是旺旺2:鸟是叽叽喳喳3:可以将父类的方法定义为狗叫让鸟继承父类重写叫的方法1:鸟怎么确定是否要重写父类方法。2:不重写,编译和运行都没有问题,只是执行鸟叫的方法就会出现狗叫4:父类的方法很难确定。classAnimal{Stringcolor;voidshout(){//如何定义呢?是旺旺还是叽叽喳喳?}}classDogextendsAnimal{voidshout(){System.out.println(旺旺);}}classBirdextendsAnimal{voidshout(){System.out.println(叽叽喳喳);}}2:使用abstract4:抽象类1:当描述一个类的时候,如果不能确定功能函数如何定义,那么该类就可以定义为抽象类,功能函数应该描述为抽象函数。5:抽象类的实现方式1:定义animal类1:定义叫的方法,无法确定方法体,不写方法体1:publicvoidshout();编译失败2:根据提示在shout的方法加入abstract修饰1:编译失败,有新的提示3:根据提示将类加入abstract修饰1:编译通过abstractclassAnimal{Stringcolor;abstractvoidshout();}classDogextendsAnimal{voidshout(){System.out.println(旺旺);}}classBirdextendsAnimal{voidshout(){System.out.println(叽叽喳喳);}}6:抽象类的特点1:有抽象函数的类,该类一定是抽象类。2:抽象类中不一定要有抽象函数。3:抽象类不能使用new创建对象1:创建对象,使用对象的功能,抽象类的方法,没有方法体。4:抽象类主要为了提高代码的复用性,让子类继承来使用。5:编译器强制子类实现抽象类父类的未实现的方法。1:可以不实现,前提是子类的也要声明为抽象的。7:抽象的优点1:提高代码复用性2:强制子类实现父类中没有实现的功能2:提高代码的扩展性,便于后期的代码维护8:抽象类不能创建对象,那么抽象类中是否有构造函数?1:抽象类中一定有构造函数。主要为了初始化抽象类中的属性。通常由子类实现。9:final和abstract是否可以同时修饰一个类?一定不能同时修饰。abstractclassAnimal{Stringname;//抽象类可以有构造函数Animal(){}Animal(Stringname){this.name=name;}abstractvoidshout();}classDogextendsAnimal{Dog(){}Dog(Stringname){super(name);}voidshout(){System.out.println(旺旺);}}classDemo3{publicstaticvoidmain(String[]args){//抽象类不能创建对象//Animala=newAnimal();Dogd=newDog(旺财);System.out.println();}}2:抽象练习1:定义抽象类MyShape(图形)1:定义抽象方法获取图形的长度和面积2:定义子类Rect继承父类MyShape1:定义自身特有的长和宽(成员变量)widthheight;2:实现父类未实现的函数。3:定义子类Circle实现父类MyShape1:定义自身特有的半径和圆周率(使用常量)2:实现父类为实现的方法。/*}2:抽象练习1:定义抽象类MyShape(图形)1:定义抽象方法获取图形的长度和面积2:定义子类Rect继承父类MyShape1:定义自身特有的长和宽(成员变量)widthheight;2:实现父类未实现的函数。3:定义子类Circle实现父类MyShape1:定义自身特有的半径和圆周率(使用常量)2:实现父类为实现的方法。*/abstractclassMyShape{abstractdoublegetLen();abstractdoublegetArea();}classRectextendsMyShape{doublewidth;doubleheight;Rect(){}Rect(doublewidth,doubleheight){this.width=width;this.height=height;}doublegetLen(){return2*(width+height);}doublegetArea(){returnwidth*height;}}classCircleextendsMyShape{doubler;publicstaticfinaldoublePI=3.14;Circle(){}Circle(doubler){this.r=r;}doublegetLen(){return2*PI*r;}doublegetArea(){returnPI*r*r;}}classDemo4{publicstaticvoidmain(String[]args){Rectr=newRect(5,5);System.out.println(r.getLen());System.out.println(r.getArea());System.out.println();Circlec=newCircle(5);System.out.println(c.getLen());System.out.println(c.getArea());}}1.1抽象类注意细节抽象类可以没有抽象方法(java.awt.*的类就是这样子操作的)。抽象类可以继承普通类与抽象类。抽象类不能直接使用类名创建实例,但是有构造方法,构造方法是让子类进行初始化。抽象类一定有构造方法。abstract与其他修饰符的关系:final与abstract不能共存:final:它的作用修饰类代表不可以继承修饰方法不可重写abstract修饰类就是用来被继承的,修饰方法就是用来被重写的。staticstatic修饰的方法可以用类名调用,对于abstract修饰的方法没有具体的方法实现,所有不能直接调用,也就是说不可以与static共存。privateprivate修饰的只能在本类中使用,abstract方法是用来被子类进行重写的,有矛盾所有不能共存.练习:使用抽象类计算一个矩形与圆形的面积。2值交换案例:定义交换数值的功能函数,基本类型数据,数组,实例对象,String。基本数据类型交换结果:发现交换值前后没有变量的值发生变化。原因分析:数组类型交换结果:交换值成功。原因分析:操作的是同一个数组对象。对象的值交换:结果:交换值成功。字符串的值交换:交换值失败。3接口3.1接口的概述接口(interface):usb接口,主要是使用来拓展笔记本的功能,那么在java中的接口主要是使用来拓展定义类的功能,可以弥补java中单继承的缺点。classPencil{Stringname;Pencil(){}Pencil(Stringname){this.name=name;}voidwrite(){System.out.println(写字);}}interfaceEraser{publicstaticfinalStringcolor=白色;publicabstractvoidclean();}//1:带橡皮的铅笔类继承铅笔类实现橡皮接口classPencilWithEraserextendsPencilimplementsEraser{PencilWithEraser(){}PencilWithEraser(Stringname){super(name);}voidwrite(){System.out.println(name+:考试专用);}publicvoidclean(){System.out.println(super.name+:带橡皮的铅笔,就是好用);}}classDemo6{publicstaticvoidmain(String[]args){PencilWithEraserpe=newPencilWithEraser(中华2B);pe.write();pe.clean();System.out.println(pe.color);System.out.println(PencilWithEraser.color);}}接口的定义格式:interface接口名{属性抽象方法}接口的体验interfaceInter{intnum=6;可以定义属性与方法。voidshow();}注意:可以通过javap命令查看.1.接口中的所有属性默认的修饰符是publicstaticfinal。2.接口中的所有方法默认的修饰符是publicabstract。疑惑:干嘛不在PencilWithEraser添加remove功能函数,而要通过接口?3.2接口的特点1.类实现接口可以通过implements实现,实现接口的时候必须把接口中的所有方法实现,一个类可以实现多个接口。2.接口中定义的所有的属性默认是publicstaticfinal的,即静态常量既然是常量,那么定义的时候必须赋值。3.接口中定义的方法不能有方法体。接口中定义的方法默认添加publicabstract4.有抽象函数的不一定是抽象类,也可以是接口类。5.由于接口中的方法默认都是抽象的,所以不能被实例化。6.对于接口而言,可以使用子类来实现接口中未被实现的功能函数。7.如果实现类中要访问接口中的成员,不能使用super关键字。因为两者之间没有显示的继承关系,况且接口中的成员成员属性是静态的。可以使用接口名直接访问。8.接口没有构造方法。3.3接口与类、接口之间的关系1.大家之前都知道类与类之间的关系继承,那么接口与类之间又是怎样子的关系呢?接口与类之间是实现关系。非抽象类实现接口时,必须把接口里面的所有方法实现。类实现接口用关键字implments,类与接口之间是可以多实现的(即一个类可以实现多个接口)。interfaceEraser{publicstaticfinalStringcolor=白色;publicabstractvoidclean();}classPencilimplementsEraser{Stringname;Pencil(){}Pencil(Stringname){this.name=name;}voidwrite(){System.out.println(写字);}@Overridepublicvoidclean(){System.out.println(涂改...);}}分析:原本铅笔没有涂改功能的,但是一旦实现了Eraser接口做了实现,那么就具备了涂改功能,那么接口的作用则是拓展功能。2.接口与接口之间的关系式继承。interfaceA{publicvoidshow();}interfaceB{publicvoidprint();}interfaceCextendsA,B{}接口与接口之间的关系是继承,接口可以多继承接口.练习:在现实生活中有部分同学在学校期间只会学习,但是有部分学生除了学习外还会赚钱。4多态4.1多态的概述1:什么是多态一个对象的多种状态(老师)(员工)(儿子)教师a=老钟;员工b=老钟;2:多态体现1:Father类1:非静态成员变量x2:静态成员变量y3:非静态方法eat,方法体输出父类信息4:静态方法speak();方法体输出父类信息2:Son类1:非静态成员变量x2:静态成员变量y3:非静态方法eat,方法体输出子类信息4:静态方法speak();方法体输出子类信息classFather{intx=1;staticinty=2;voideat(){System.out.pr
本文标题:day07抽象类,接口多态
链接地址:https://www.777doc.com/doc-2909449 .html