##学习记录
抽象类
首先,我们知道在面向对象程序中的对象都是由类来描述的,但是反过来,并不是所有的类都能够用来实例化,描述一个对象,也就是说这个类还不够详细, 那么如果一个类没有足够的信息来描述一个具体的对象,这个类叫做抽象类。
如何理解抽象类呢?(这个地方比较难理解)
如之前讲到的图形打印 ,这个Shape类里虽然有一个draw方法,可以实现画图形,但是Shape这个类也不是具体的某个图形类,他只是一个“形状类” 而形状有很多种,我们讲如果要实例化一个对象,用来实例的类必须是具体的 实例的,不然怎么实例对象呢?如果讲强行用shape来实例一个三角形对象,那么好,shape所具有的三角形这个形状能用来描述三角形这个对象,但是你还要拿其他形状比如长方形的特征来描述吗?多此一举, 所以shape是无法具体化和实例化的,是抽象的,必须通过子类具体的形状类,比如三角型类(class rect)圆形类(class cycle)来实例化对象,再调用draw方法画具体的图形。(个人理解)
在shape这个类里面的draw方法实际上从始至忠都没有被调用,这个方法叫做抽象方法,包含抽象方法的类叫做抽象类。
抽象类语法:被abstract修饰的类叫做抽象类,被abstract修饰的方法叫做抽象方法。
抽象类和普通类一样都是类,所以抽象类里可以有普通成员方法和成员变量以及构造方法抽象方法没有具体的实现,没有实现体
抽象类得特性:
1抽象类不能直接实例化对象(因为类是抽象得)
2子类继承抽象类后需要重写父类的抽象方法(若不想写,则可以将子类也变成抽象类,但是如果有任何一个非抽象类再来继承抽象子类,构成多层继承,那么在该非抽象类种必须将所有的抽象方法都具体实现,即抽象)
3抽象方法不能被private修饰(因为子类继承抽象类时候要进行抽象方法的重写,被private修饰的方法无法重写)
4抽象方法不能被final static修饰(同理,抽象方法要重写就得满足重写的那几个小条件)
5抽象类里可以有抽象方法,可以无,但是抽象方法一定得是在抽象类中,普通类不行。
6抽象类中可以包含构造,供子类实例化对象时候调用父类构造方法对父类成员进行初始化。
抽象类得作用:
相较于普通父类来说,抽象父类多了一层校验,很多语法存在的意义其实就是用来校验的,如final,对于一个变量来说,我不想去改变它的值,我们可以用final来修饰一下它,让其变成参量,如果后续误改了它的值,编译器能报错,这时候就能充分利用编译器的校验。。。。。。
接口
我们先看概念,对于一个新事务一定得先理解概念,其他的语法·用法可以不急,这些是人家规定的,无需多理解,但是对于概念是通过一些类似社会的现象或者为达到某个目的而引入出来的。
接口概念:
我们生活中的接口比比皆是,电脑usb接口,插板插座孔,只要符合usb协议的像鼠标 键盘 u盘都可以接电脑usb接口,只要符合插电规范的(像三孔 双孔)插头 冰箱 电脑 洗衣机都可以去插,达到用点的目的。他们都符合一定的公共规范后然后能够使用。
从上面的例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
接口的语法规则
与定义类相似,只不过像class换成interface
1. 创建接口时, 接口的命名一般以大写字母 I 开头.
2. 接口的命名一般使用 "形容词" 词性的单词.
3. 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性
接口的使用
接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法
必须用到implements关键字
注意:子类和父类之间是extends继承关系 类和接口之间是implements实现关系。
接口的特性
1接口类型是一种引用类型,接口不能用来new对象
2接口里的方法都是默认由public abstract修饰的,不允许用其他来修饰,没有实现体,必须有一个实现类来实现接口当中的所有方法。
3接口中的字段都是由public static final修饰的参量
4接口中的方法没有实现体,必须有一个实现类来实现接口当中的所有方法。
5重写接口中方法时,不能使用默认的访问权限(因为重写时子类访问权限必须大于等于父类,而父类默认是public)
6接口中不能有静态代码块和构造方法
7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
8. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类(你这个类可以不实行接口中的方法,但是你必须是抽象类,若有一个类来继承这个抽象类,包括抽象类里的抽象方法全都得重写,出来混是要换得。)
实现多个接口
Java中类和类不能多继承,一个类只能有一个父类,但是一个类可以实现多个接口。
我们知道鸭子是一种动物,那么它和动物是继承关系,它能跑,能飞,能游泳,所以我们写出跑
飞,游泳得接口来,鸭子都符合这些规范标准,能够实现接口,并调用相应得动作方法。猫就是只符合跑这一标准,只能实现跑这个接口。
注意:实现多个接口时,每个接口的抽象方法都要实现,除非实现类为抽象类。
鸭子继承了动物,同时实现了多个接口,这是面向对象程序里常见的用法,------》一个类继承一类,同时实现多个接口。
继承表达是:is a关系(什么是什么) 组合表达has s a part of(什么有什么或者什么是什么的一部分) 接口表达是具有某种特性 如鸭子是动物,具有跑 游泳,飞这几种特性 猫是动物,具有跑这种特性。
为什么要实现多个接口?为什么要有接口呢?直接在动物这个父类中把相应的跑,飞动作方法写出来,然后再子类重写不行吗?
那么我们思考一个问题:1:机器人会跑,机器人是动物吗?显然不是,那么机器人类和动物类就没有继承关系,也就无法重写动物里跑的方法,那么机器人怎么实现跑呢?所以如果有接口的话就无需考虑这层继承关系,我只要符合标-------》能够跑,可以实现接口,那管你是什么东西在跑,我就能重写接口的方法,达到相应目的。:2:我们知道不能多继承,但是能接口可以多实现,假设“跑方”法在类A,“游泳方法”在类B,“飞方法”在类C,那么鸭子类就必须将A B C类都继承了,才能使用从父类继承下来的相应的动作方法,这显然是不能多继承的,那么接口就很好的解决了这个问题。(理解)
总结:时刻牢记多态的好处, 让程序猿忘记类型. 有了接口之后, 类的使用者(完善猫,鸭子类时候)就不必关注具体类型(不用管是鸭子还是狗还是人), 而只关注某个类是否具备某种能力(比如跑)。而且灵活,需要某种动作直接写一个类,不需要去改父类,修改代码的成本低。
接口间的继承
类不能多继承,但是接口能够多继承,也是使用extends关键字
内部类
1局部内部类:
定义在外部类中的方法的方法体中 实例:
2实例内部类
定义在外部类当中,就相当于定义一个普通的类,只不过位置是在一个类当中,作为外部类的一个成员,这个成员是类,不是方法或者变量。 【注意事项】 1. 外部类中的任何成员都可以在实例内部类方法中直接访问
2. 实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束 3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名 称.this.同名成员 来访问
4. 实例内部类对象必须在先有外部类对象前提下才能创建
5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用(this)
6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。
3静态内部类
注意
1. 在静态内部类中只能访问外部类中的静态成员 如果确实想访问,我们该如何做?用this
2. 创建静态内部类对象时,不需要先创建外部类对象
4匿名内部类