目录
第一部分:抽象类
1.抽象类:
定义的格式:
public/protect abstract class 类名{}
抽象类是一种特殊的父类
特殊的原因:内部允许编写抽象方法
2.抽象方法:
当我们将共性的方法抽取到父类之后,发现这个方法在父类中无法给出具体的描述,即每一个子类重写方法的时候,实现方法的内容各不相同,所有无法进行具体性描述。而且这个方法还是子类必须要有的方法就可以设计为抽象方法。抽象方法存在于抽象类中(存在抽象方法的类必须为抽象类)
定义格式
public abstract 返回值类型 方法名(参数列表);
抽象方法只需要声明,不需要实现,抽象方法没有定义方法体,方法名后面直接跟分号即可
注意事项:
1.抽象类的子类必须强制重写抽象类(父类)的所有抽象方法;
2.抽象类不能实例化:不能创建对象,如果实例化,就会调用内部没有方法体的抽象方法,无意义;
3.抽象类存在构造方法:
抽象方法既然不能实例化,构造方法存在的意义何在?
1.父类优先于子类存在,子类实例化时,优先执行构造方法,子类的每一个构造方法中会默认调用父类的无参构造,因为子类的构造方法的第一句隐藏了super(),它由系统自动调用,这种情况是父类只有抽象方法,无成员变量
2.还有由子类的构造方法调用父类的有参构造方法完成子类的实例化,这种情况是当父类抽取子类共有的成员变量时,子类可以在自己的有参构造中,调用父类的无参构造,完成自身实例化,
4.抽象类中可以存在普通方法:让子类继承使用
5.抽象类的子类要么重写抽象类中的所有抽象方法,要么自己变为抽象类,即交给自己的儿子重写爸爸没有重写的爷爷的抽象方法,或者爸爸还有一些特别嘱托(抽象方法)交给儿子
3.abstract关键字的冲突:(它们不能共存)
final :修饰的方法不允许被子类重写
private:修饰的方法不允许被子类重写
static:修饰的方法可以通过类名调用,类名调用抽象方法无意义
public abstract class Aabstract { //父类->抽象类
public abstract void work(); //抽象方法(每个子类工作的内容不同,
故无法具体描述,定义为抽象方法)
}
//class people extends Aabstract{ //子类1//继承抽象方法(父类),
//对抽象方法不进行重写则会报错
//}
class student extends Aabstract{ //子类2
@Override //重写抽象方法
public void work() {
System.out.println("好好学习,天天向上!");
}
}
class teacher extends Aabstract{ //子类3
@Override //重写抽象方法
public void work() {
System.out.println("教书育人!");
}
}
第二部分:接口
接口的定义:(传达规则->制造者制定规则 使用者遵守规则)
一个抽象类中全部是抽象方法(唯一价值,声明规则),故将次抽象方法设计为接口
接口定义的格式:
[public] interface 接口名 [extends 其它类名]{
}
注意
1.接口不允许实例化
2.实现接口(规则)的类称为实现类,即接口的子类
接口的子类:
1.重写接口中的所有抽象方法
2.在不想实现接口的前提下,可以将实现类定义为抽象类,为接口中的抽象方法提供存活环境即提供抽象方法(把接口可以当作实现类的干爹)(但一般不这样做)
3.接口中成员的特点:
- 成员变量(大写):只能定义常量,因为系统会默认加入三个关键字public static final三个关键字,无顺序关系,接口内定义变量成员会默认转为常量
- 成员方法:只能为抽象方法,系统默认加入public abstract
- 构造方法:没有构造方法。
实现类(子类)的构造方法中隐藏父类的无参构造super,既然没有构造方法,这无参构造super从哪里来?
答:接口可以认为是干爹,其实实现类默认会继承object()祖先类,祖先类提供super;
4.接口与类的关系:
- 1.回顾一下类与类的关系:继承关系,只支持单继承,不支持多继承,但可以多层继承;
- 2.类与接口的关系:实现关系(类实现接口的抽象方法)通过implements关键字来完成
可以单实现,也可以多实现,甚至可以继承一个类的同时,实现多个接口(无冲突,因为接口只是声明,没有具体化,无代码逻辑)
多实现:
//多继承:
interface A{ //接口1
void fun1();
}
interface B{ //接口2
void fun2();
}
public class Iinterface implements A,B{ //实现类,实现多个接口
@Override
public void fun1() {
}
@Override
public void fun2() {
}
}
继承一个类的同时,实现多个接口
class fu //父类
{
public void fun()
{
System.out.println("我是fun()方法");
}
}
interface A{ //接口1
void fun();
}
interface B{ //接口2
void fun(); //同名不产生冲突
}
class zi extends fu implements A,B{ //实现类(子类),继承了fu类的fun方法,实现多个接口的重写
}
- 3.接口与接口的关系:
继承关系,可以单继承,也可以多继承
interface A{ //接口1
void fun1();
}
interface B{ //接口2
void fun2();
}
interface C extends A,B{ //接口3,继承接口1.2
void fun3();
}
public class Iinterface implements C{ //实现类,实现接口3时,不仅要实现接口3,而且接口3继承的其他接口也要实现
@Override
public void fun1() {
}
@Override
public void fun2() {
}
@Override
public void fun3() {
}
}
第三部分:抽象类与接口的对比
-
成员变量:
抽象类:常量,变量都可
接口:只能常量
-
成员方法:
抽象类:具体方法,抽象方法
接口:抽象方法
-
构造方法:
抽象类:有(子类super访问)
接口:无(子类干爹,由子类的祖先(object)或爹(子类存在继承关系)负责实现子类中的抽象方法super)
-
使用场景
抽象类:对事物进行抽象(描述事物,包括行为和属性)
接口:负责对行为做抽象,制定规则