上节课回顾、
B是A中得一员 才可以继承A
A extends B
子类和父类一样得 函数,我们成为函数得重写Overrid
函数分两部分
第一 声明部分
第二 函数得实验体
抽象 abstract
当子类不需要父类中的实验体,可以将父类中的实验体删掉
例子:大括号内为实验体
public abstract void study();
abstract:抽象的,可以是修饰函数或则 类,
抽象类:abstract 修饰的类
抽象函数:abstract 修饰的函数
抽象函数的声明:修饰符 abstract 返回值类型 函数名 (形参);
注意:
1.抽象函数必须位于抽象类中,抽象类中不一定有抽象函数,
2.抽象类 是有构造器的,但是不能创建自己类型的对象,(实例化)
3.抽象类 可以强迫子类做事情:
(子类继承抽象函数,要么自己成为抽象函数,要么(实现该功能)重写父类函数)
ctrl + o 重写
抽象类与普通类的区别
1.都有构造器,但是抽象类不能创建自己类型的对象,
2.抽象类中,既有抽象函数,又有普通函数(包含静态函数);
普通类 中,只能有普通函数(包含静态函数);
3.抽象类 可以强迫子类做事情;
问题:抽象关键字 abstract 不能和那些关键字一起使用?
1.private private abstract void study();
私有后 子类不能继承了 所以冲突
2.static 父类没初始化 ,static 就存在了
3.final final 函数 不能重写
final 修饰类 为最终类 (最终的类 没有子类)不能被继承
注意点:
可以根据父的构造器,构建子类的构造器
引用数据
1.宿主
2.类
3.接口
接口
接口关键字 interface 不是class
接口 /interface (接口就是规范)、
举例 : USB 接口 规范
接口是用来实现的,由类进行实现的,类实现接口后,会具备继承的特性,
接口是父类,实现类是子类
关系:
类与类:单继承 ,但是支持多层继承
类与接口:类来实现接口,一个类在继承另一个类的同时,可以实现多个接口,
接口与接口之间的关系 : 多继承,支撑多层函数
问题?什么时候使用继承?什么时候使用实现?
只有当B 是A 中的一员时候,B 才能继承A
当B 像A一样 具备某个功能时,使用实现
接口定义:
当一个类都是抽象函数,这个类可以定义为接口
interface
接口 创建取名字 :IA
实现类 IA impl 子类要实现父类所有抽象函数
public class A implements IA(){
}
enum 枚举
Annoation 注解
public interface IA{
double PI = 3.14;(成员常量)
double PAI =3.0;(成员常量)
public abstract void m1(); 抽象函数
int m2(String num); 抽象函数
}
接口的成员
JKD8.0 之前的成员 :
1. 常量(成员常量)
2.抽象函数
JKD8.0 之后的成员 :
1.默认级函数(可以带大括号了)
default void m3(){
sout
}
2.静态函数
static Number m4(int num){
return num;
}
(接口名等同于类名,用IA.m4 调用)
(类与类之间的继承,是可以继承静态函数的)
(接口之间的实现,子类无法获取父类中的静态函数)
A继承B : A extends B
ctrl + o 重写
implements 实现
模板法:
当程序的一部分是确定的,另一部分不确定,而确定部分在使用不确定部分,
此时,将不确定的部分,改为抽象,交给子类完成,
模板法是线程的设计原理
模板法
自己总结:先建立一个abstract抽象类 ,再写一个获取时间的函数,
此函数用final来修饰,不可被继承,
要测试的程序写成抽象函数,
因为抽象函数可被子类继承,子类extends继承后不变抽象函数,
选择实现父类抽象函数,对父类抽象函数进行重写Override,
这样这个子类在测试时,可以被new,
测试时跑父类的final修饰函数就可以。