网址:hn9986.com客服QQ3503248302新老客服都有福利目录1.抽象类1.抽象类概述1.1为什么会有抽象类?(抽象类的作用)1.2抽象类的定义抽象类特征3.抽象类成员特征4.抽象类案例2.接口1.接口概述2.接口特征3.接口成员特征4.接口案例5.类和interfaces之间的关系1)类与接口的关系2)接口与接口的关系六、抽象类与接口的区别总结一、抽象类1、抽象类概述1.1为什么会有抽象类?(抽象类的作用)先给大家举个例子:假设我们有一个父类动物类(Animal),从该动物类继承了两个子类猫(Cat)和狗(Dog)。在动物类中,有一个eat()方法,猫类和狗类重写了eat()方法。我们都知道猫狗的进食行为是可以具体实现的,比如猫吃鱼,狗啃骨头,也就是说可以有方法体。但是它们的父类Animal中的eat()方法不能有具体的实现(没有方法体),因为Animal只是一个抽象的概括,并不是具体的东西,所以我们应该把动物类和它的eat()方法放在一起定义为抽象。//抽象类定义publicabstractclassclassname{}//抽象方法定义publicabstractvoideat();2)抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类3)抽象类不能实例化,但可以通过多态创建子类对象4)抽象类的子类要么覆盖抽象中的所有抽象方法父类或者子类本身也是一个抽象类3.抽象类的成员特点1)成员变量可以是变量也可以是常量2)构造函数有构造函数,用于初始化子类访问父类数据3)成员方法可以是抽象方法:限制子类完成某些动作。也可以是非抽象的方法:提高代码的复用性。4.抽象类案例要求:请采用抽象类的思想实现猫狗案例,在测试类中进行测试。思路:代码实现:packagecom.itheima_04;/*动物类*/publicabstractclassAnimal{privateStringname;私人年龄;publicAnimal(){}publicAnimal(Stringname,intage){this.name=name;这个。年龄=年龄;}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){返回年龄;}publicvoidsetAge(intage){this.age=age;}publicabstractvoideat();}packagecom.itheima_04;/*猫类*/publicclassCatextendsAnimal{publicCat(){}publicCat(Stringname,intage){super(name,age);}@Overridepublicvoideat(){System.out.println("猫吃鱼");}}packagecom.itheima_04;/*狗类*/publicclassDogextendsAnimal{publicDog(){}publicDog(Stringname,intage){super(name,age);}@Overridepublicvoideat(){System.out.println("狗吃骨头");}}packagecom.iheima_04;/*测试类(本测试类只测试猫对象,小伙伴们可以自己测试狗对象)*/publicclassAnimalDemo{publicstaticvoidmain(String[]args){//创建多态方式的对象Animala=newCat();a.setName("加菲猫");a.setAge(5);System.out.println(a.getName()+","+a.getAge());a.吃();System.out.println("--------");a=newCat("加菲猫",5);System.out.println(a.getName()+","+a.getAge());a.吃();}}2.接口1.接口概述接口是一个公共标准,只要符合标准,人人都可以通用就像现实生活中一样,两个不同厂家生产的U盘可以插在同一个usb接口上使用,这是因为它们都遵循一个统一的标准。Java中的接口更多的体现在对行为的抽象上!(我个人认为接口可以看做是一个特殊的抽象类;但是需要注意的是,它和抽象类是有区别的,下面会讲到。)2.接口特点1)用关键字修饰接口interfacepublicinterfaceinterfacename{}2)类实现接口用implements表示public类类名implementsinterfacename{}3)接口不能实例化,可以通过多态创建实现类对象。多态的形式:具体类多态、抽象类多态、接口多态。4)接口的实现类要么重写接口中的所有抽象方法,要么将实现类定义为抽象类3、接口成员特性1)成员变量只能是常量,默认修饰符为:publicstaticfinal2)接口中没有构造方法构造方法,因为接口主要是扩展功能,没有具体的存在。3)成员方法只能是抽象方法,默认修饰符是:publicabstractJDK8以后可以有静态方法。JDK9之后,可以有默认方法了。4.接口案例要求:训练猫狗,能跳高。功能。请使用抽象类和接口来实现猫狗案例,并在测试类中进行测试。思路:代码实现(这段代码只实现了猫类,狗类的小伙伴可以自己实现):packagecom.itheima_03;/*animalclass*/publicabstractclassAnimal{privateStringname;私人年龄;publicAnimal(){}publicAnimal(Stringname,intage){this.name=name;这个。年龄=年龄;}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){返回年龄;}publicvoidsetAge(intage){this.age=age;}publicabstractvoideat();}packagecom.itheima_03;/*highjumpinterface*/publicinterfaceJumping{publicabstractvoidjump();}packagecom.iheima_03;/*catclass*/publicclassCatextendsAnimalimplements跳跃{publicCat(){}publicCat(Stringname,intage){super(name,age);}@Overridepublicvoideat(){System.out.println("猫吃鱼");}@Overridepublicvoidjump(){System.out.println("猫能跳得很高");}}包com。itheima_03;/*测试类*/publicclassAnimalDemo{publicstaticvoidmain(String[]args){//创建对象,调用方法Jumpingj=newCat();j.jump();System.out.println("--------");动物a=newCat();a.setName("加菲猫");a.setAge(5);System.out.println(a.getName()+","+a.getAge());a.eat();//a.jump();a=newCat("加菲猫",5);System.out.println(a.getName()+","+a.getAge());a.吃();System.out.println("--------");猫c=新猫();c.setName("加菲猫");c.setAge(5);System.out.println(c.getName()+","+c.getAge());c.吃();c.跳跃();}}5.类与接口的关系1)类与接口的关系实现关系可以是单个也可以是多个,在继承一个类的同时可以实现多个接口2)接口与接口的关系继承关系可以是单继承,或多重继承。6、抽象类和接口的区别我来说明一下设计理念上的区别(重要区别):比如门类有开门和关门的基本功能,但是有的门除了这两个基本功能外还有报警功能.不是每扇门都有报警功能,也不是只有门有这个功能,所以我们可以用接口来封装报警功能,门的属性和开关门的功能可以用抽象类来封装。本文到此结束,希望对你有所帮助
