本节目标1.抽象类1.1 抽象类的概念在面向对象的概念中所有的对象都是通过类来描述的但是反过来并不是所有的类都是用来描述对象的如果一个类中没有足够的信息来描述一个具体的类这样的类就是抽象类。比如例子一说明1.矩形、三角形、圆形都是图形因此和Shape类的关系应该是继承关系2.虽然图形Shape中也存在draw的方法但由于Shape类并不是具体的图形因此其内部的draw方法实际是没有办法实现的3.由于Shape类没有办法描述一个具体的类导致其draw方法无法具体实现因此可以将Shape类设计为“抽象类”例子二说明1.Animal的动物类每个动物都有叫的方法但由于Animal不是一个具体的动物因此其内部bark方法无法具体实现2.Dog是狗类首先狗是动物因此与Animal是继承关系其次狗是一种具体的动物狗叫汪汪汪其次bark可以实现3.Cat是猫类首先猫是动物因此与Animal是继承关系其次猫是一种具体的动物猫叫喵喵喵其bark可以实现。4.因此Animal可以设计为“抽象类”在打印图形的例子中我们发现父类Shape中的draw方法好像并没有说明实际工作主要的绘制图形都是由Shape的各种子类draw方法来完成的。像这种没有实际工作的方法我们可以把它设计成一个抽象方法abstract method包含抽象方法的类我们称为抽象类abstract class1.2 抽象类语法在java中一个类如果被abstract修饰称为抽象类抽象类中被abstract修饰的方法称为抽象方法抽象方法不用给出具体的实现体抽象类抽象方法提问1.什么时候用抽象方法当不想自己的方法里面有具体实现的时候我们可以使用abstract把其变成抽象方法2.为什么要用抽象方法因为之后我们会根据多态给draw对相应的对象实现对应的结果所有Shape里面的方法我们并不需要有具体实现。3.抽象方法有什么好处正常情况下不给方法写上花括号编译器会报错抽象方法可以使我们的代码更加简洁注意抽象类也是类内部可以包含普通方法和属性甚至构造方法1.3 抽象类特性1.抽象类不能实例化对象2.抽象方法不能是private的记住抽象类就是为了被继承的3.抽象方法不能被final和static修饰因为抽象方法要被子类重写4.抽象类必须被继承并且继承后子类要重写父类中的抽象方法否则子类也必须是抽象类必须要使用abstract修饰正确或者5.抽象类中不一定包含抽象方法但是有抽象方法的类一定是抽象类6.抽象类中可以有构造方法供子类创建对象时初始化父类的成员变量1.4 抽象类的作用抽象类本身不能被实例化要想使用只能创建该抽象类的子类然后让子类重写抽象类中的抽象方法。有些同学可能会说普通的类也可以被继承呀普通的方法也可以被重写呀为啥非要用抽象类和抽象方法呢确实如此但是使用抽象类相当于多了一重编译器的校验使用抽象类的场景就如上面的代码实际工作不应该由父类完成而应由子类完成。那么此时如果不小心误用成父类了使用普通类编译器是不会报错的但是父类是抽象类就会在实例化的时候提示错误让我们尽早发现问题很多语法存在的意义都是为了“预防错误”例如我们曾经使用过的fianl也是类似创建的变量用户不去修改不就相当于常量嘛但是加上fianl能够在不小心误修改的时候让编译器即使提醒我们充分利用编译器的校验在实际开发中是非常有意义的。补充匿名对象格式它与我们之前使用的创建对象使用方法的代码有什么区别区别在于匿名对象只能使用一次而图中上面的方法可以使我们创建的对象多次使用。图一在这里的cycle都是同一个图二这里的cycle是相当于有四个cycle2.接口2.1 接口的概念在现实生活中接口的例子比比皆是比如笔记本上的USB接口电源插座等。电脑的USB口上可以插U盘、鼠标、键盘...所有符合USB协议的设备通过上面的例子可以看出接口就是公共的行为规范标准大家在实现时只要符合规范标准就可以通用。在Java中接口可以看成是多个类的公共规范是一种引用数据类型2.2语法规则接口的定义格式与定义类的格式基本相同将class关键字换成interface关键字就定义了一个接口提示1.创建接口时接口的命令一般以大写字母I开头2.接口的命名一般使用“形容词”词性的单词美丽的、可爱的等....3.阿里编码规范中约定接口中的方法和属性不要加任何的修饰符号保持代码的简洁性2.3接口的使用接口不能直接使用必须要有一个“实现类”来“实现”该接口实现接口中的所有抽象方法。注意子类和父类之间是extends继承关系类与接口之间是implements实现关系请实现笔记本电脑使用USB鼠标、USB键盘的例子1.USB接口包含打开设备、关闭设备功能2.笔记本类包含开机功能、关机功能、使用USB设备功能3.鼠标类实现USB接口并具备点击功能4.键盘类实现USB接口并且具备输入功能USB接口笔记本类鼠标类键盘类运行2.4 接口特性1.接口类型是一种引用类型但是不能直接new接口对象2.接口中每一个方法都是public的抽象方法即接口中的方法会被隐式的指定为public abstract只能是public abstract其他修饰符都会报错3.接口中的方法是不能在接口中实现的只能由实现接口的类来实现除非在前面加上static或default4.重写接口的方法时不能使用默认的访问权限继承的子类权限必须大于等于父类的权限接口默认public子类就必须是public5.接口中可以含有变量但是接口中的变量会被隐式的指定为public static final变量6.接口中不能有静态代码块和构造方法7.接口虽然不是类但是接口编译完成后字节码文件的后缀格式也是.class8.如果类没有实现接口中的所有抽象方法则类必须设置为抽象类小结2.5 实现多个接口在java中类和类之间是单继承一个类只能有一个父类即java中不支持多继承但是一个类可以实现多个接口。下面通过类来表示一组动物另外我们再提供一组接口分别表示“会飞的”“会跑的”“会游泳的”同理可得接下来我们创建几个具体的动物狗会跑游泳鸭会飞、跑、游泳注意一个类实现多个接口时每个接口的抽象方法都要实现否则类必须设置为抽象类提示IDEA中使用ctrli可以实现快速接口上面代码展现java面向对象编程中最常见的用法一个类继承一个父类同时实现多种接口继承表达的含义是is-a语义而接口表达的含义是具有xxx特性狗是一种动物具有会跑的特性鸭子是一种动物既能跑也能游泳还能飞这样设计有什么好处呢时刻牢记多态的好处让程序员忘记类型。有了接口之后类的使用者就不必关注具体类型而只关注某个类是否具备某种能力例如现在实现实现一个方法叫“跑”在这个walk方法内部我们并不关注到底是那种动物只要参数是会跑的就行甚至参数可以不是“动物”只要会跑就行2.6 接口间的继承在java中类和类之间是单继承一个类可以实现多个接口接口与接口之间可以多继承。即用接口可以达到多继承的目的。接口可以继承一个接口达到复用的效果。使用extends关键字。通过接口继承创建了一个新的接口IC。此时要实现接口创建的D类就要继续实现testC方法也需要实现testA和testB方法。接口间的继承相当于把多个接口合并在一起2.7 接口使用实例给对象数组排序3 Object类Object是java默认提供的一个类。Java里面除了Object类所有的类都是存在继承关系的。默认会继承Object父类。即所有类的对象都可以使用Object的引用进行接收。范例使用Object接收所有类的对象