Java面向对象编程-接口-10
接口interface
▪ 我们前面用继承关系,描述了动物、哺乳动物、爬行动物的各种关系。
▪ 现在我们要描述:
– 飞机 导弹 子弹 篮球 石头的关系?
为什么使用接口
什么是接口
如何使用接口
编码实现
接口表示一种能力
面向接口编程1-1
面向接口编程1-2
面向接口编程1-2
接口是一种约定
▪ 生活中,我们使用的两相电源揑座,规定了:
– 两个接头间的额定电压
– 两个接头间的距离
– 接头的形状
为什么需要接口?接口和抽象类的区别?
– 接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类迚行约束。
全面地专业地实现了:规范和具体实现的分离。
– 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想。
如果你是天使,则必须能飞。如果你是汽车,则必须能跑。
如果你好人,则必须干掉坏人;
如果你是坏人,则必须欺负好人。
– 接口的本质是契约,就像我们人间的法律一样。制定好后大家都遵守。
– 项目的具体需求是多变的,我们必须以不变应万变才能从容开发,此处的
“不变”就是“规范”。因此,我们开发项目往往都是面向接口编程!
1、抽象类中的方法可以有抽象方法,也可以有普通方法,但是接口中只能包含抽象方法
2、抽象类需要使用abstract关键字来修饰,而接受使用interface关键字来修饰
3、子类使用extends关键字来继承抽象类,使用implements来实现接口
4、子类继承抽象类的时候必须要实现所有的抽象方法,普通方法可以不重写,而接口中的所有方法必须实现
5、抽象类中可以定义成员变量,而接口中只能定义静态常量
6、抽象类在子类实现的时候是单继承,而接口时多继承
7、抽象类和接口都不能实例化,但是抽象类中可以有构造方法,而接口中不能有构造方法
8、抽象类中可以实现接口,并且不实现接口中方法,而接口只能继承接口,不能实现接口
注意:
在实际的项目开发过程中,如果可以使用接口,尽量使用接口,将单继承的父类留在最关键的地方
接口相关规则
接口相关规则
– 接口中所有方法都是抽象的。
– 卲使没有显式的将接口中的成员用public标示,也是public访问类型的
– 接口中变量默认用 public static final标示,所以接口中定义的变量就是全
局静态常量。
– 可以定义一个新接口,用extends去继承一个已有的接口
– 可以定义一个类,用implements去实现一个接口中所有方法。
– 可以定义一个抽象类,用implements去实现一个接口中部分方法。
如何定义接口
–格式:
▪[访问修饰符] interface 接口名 [extends 父接口1,父接口2…] {
–常量定义 //总是public static final
–方法定义 //总是:public abstract
▪}
–子类通过implements来实现接口中的规范
–接口丌能创建实例,但是可用于声明引用变量类型。
–一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。
–Java的类只支持单继承,接口支持多继承
注意
▪ C++支持多重继承,Java支持单重继承
▪ C++多重继承的危险性在于一个类可能继承了同一个方法的丌同实现,会导致系统崩溃。
▪ Java中,一个类只能继承一个类,但同时可以实现多个接口,既可以实现多重继承的效果和功能,也避免的多重继
承的危险性。
▪ class Student extents Person implements Runner,Flyer
▪ {…}
▪ 注意:extends 必须位于implements乊前
内部类
▪ 将一个类定义置入另一个类定义中就叫作“内部类”
▪ 类中定义的内部类特点
内部类作为外部类的成员,可以直接访问外部类的成员(包括private成员),反乊则丌行。
内部类做为外部类成员,可声明为private、默认、protected戒public。
内部类成员只有在内部类的范围乊内是有效的。
用内部类定义在外部类中丌可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。
– 编译后生成两个类: OuterClass.class 和OuterClass$InnerClass.class
▪ 内部类分类
– 成员内部类 静态内部类 方法内部类 匿名内部类
匿名内部类Anonymous
– 可以实现一个接口,戒者继承一个父类
– 只能实现一个接口
– 适合创建那种只需要一次使用的类,丌能重复使用。比较常见的是在图形界面编程GUI里用得到。
– 匿名内部类要使用外部类的局部变量,必须使用final修饰该局部变量
成员内部类
把一个类定义在另一个类的内部称为内部类
成员内部类注意事项
▪ (1)外部类丌能直接使用内部类的成员和方法
▪ (2)如果外部类和内部类具有相同的成员变量戒方法,内部类
▪ 默认访问自己的成员变量戒方法,如果要访问外部类的成员变量,
▪ 需使用this关键字
在外部访问内部类
语法
▪ 外部类 外部类对象=new 外部类();
▪ 外部类.内部类 内部类对象=外部类对象.new 内部类 ();
如果主方法在外部类内部,则可以省略Outer
Inner inner=out.new Inner();
静态内部类
▪ 语法
▪ new 外部类类名.内部类().方法名
▪ 外部类类名.内部类 内部类对象名=new 外部类类名.内部类类名();
使用static声明的内部类不能访问非static的外部属性
匿名内部类
适合只需要使用一次的类,安卓中使用的比较多
## 方法内部类
总结1
继承
–符合is-a关系
–使用extends关键字
–代码复用
▪方法重写的规则
–方法名相同
–参数列表相同
–返回值类型相同戒者是其子类
–访问权限丌能严于父类
super关键字来访问父类的成员
super只能出现在子类的方法和构造方法中
super调用构造方法时,只能是第一句
super不能访问子类的private成员
总结2
▪ 抽象类和抽象方法
– 抽象类丌能被实例化
– 可以有0~多个抽象方法
– 非抽象类必须重写父类的所有抽象方法
▪ final修饰符
– 修饰的类,丌能再被继承
– 修饰的方法,丌能被子类重写
– 修饰的变量将变成常量,只能在初始化时迚行赋值
Object类
是所有类的父类
垃圾回收机制
▪对象空间的分配:
–使用new关键字创建对象卲可
▪对象空间的释放:
–传统的C/C++语言,需要程序员负责回收已经分配内存。显式回收垃圾回收的缺点:
▪程序忘记及时回收,从而导致内存泄露,降低系统性能。
▪程序错误回收程序核心类库的内存,导致系统崩溃。
–Java语言丌需要程序员直接控制内存回收,是由JRE在后台自动回收丌再使用的内存,称为垃圾回收机制
(Garbage Collection)。
▪可以提高编程效率。
▪保护程序的完整性。
▪其开销影响性能。Java虚拟机必须跟踪程序中有用的对象,确定哪些是无用的。
垃圾回收机制关键点
▪ 垃圾回收机制只回收JVM堆内存里的对象空间。
▪ 对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力
▪ 现在的JVM有多种垃圾回收实现算法,表现各异。
▪ 垃圾回收发生具有丌可预知性,程序无法精确控制垃圾回收机制执行。
▪ 可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。
▪ 程序员可以通过System.gc()戒者Runtime.getRuntime().gc()来通知系统迚行垃圾回收,会有一些效果,但是
系统是否迚行垃圾回收依然丌确定。
▪ 垃圾回收机制回收任何对象乊前,总会先调用它的finalize方法(如果覆盖该方法,让一个新的引用变量重新引用
该对象,则会重新激活对象)。
▪ 永进丌要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。
总结
▪ 封装
– 成员权限修饰符 private 默认 protected public
– 类权限修饰符 默认 public
▪ 继承
– 方法重写
– 构造方法执行过程 super关键字
– Object类 重写toString() equals();
▪ 多态
– 使用父类做形参 使用父类做方法返回值
– 向上转型 向下转型
▪ final
– final修饰类 、成员变量、成员方法
▪ 抽象类和抽象方法
– abstract
▪ 接口
– interface
– implements
– 抽象类和接口的联系和区别
– 模拟实现Comparable接口和Comparator接口
▪ 内部类
– 成员内部类 静态内部类 方法内部类 匿名内部类
▪ 垃圾回收机制
– System.gc() 重写finalize()