抽象abstract类概述
Java中使用“抽象方法”来解决这个问题,抽象方法的意思就是:只规定方法的签名,并不提供方法的实现,即:没有方法体。
Java规定:只有方法签名,没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
样例:
abstract class Animal{
public abstract void move();
}
抽象类/方法特点
抽象类和抽象方法必须用abstract关键字修饰
- 抽象类定义
abstract class 类名 {}
- 抽象方法定义,在返回值前,或修饰符前加上abstract关键字
- 方法没有方法体,即:没有{}
abstract public void eat();
public abstract void eat();
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类完全可以有成员变量和非抽象成员方法
抽象类不能实例化
抽象类的实例化按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态
抽象类可以有构造方法,抽象方法是用来被子类调用的,程序员不能调用
抽象类的子类--使用extends
- 要么是抽象类,不完全实现其父类的抽象方法
- 要么重写抽象类中的所有抽象方法,这个子类就是一个完全的实现类了,所以可以用来实例化对象
抽象类,抽象方法定义时的非法组合
- private abstract
抽象方法依靠子类去实现,但是私有方法在类外就不能访问,也就无法实现
- final abstract
final修饰的方法不能被重写,而抽象方法就是需要子类实现,矛盾
- static abstract
抽象方法在本类中是没有方法体的,使用类名调用的时候调用的是没有方法体的方法,无作用
总结,在abstract类中:
成员变量
- 可以是变量,也可以是常量(final)
构造方法
- 有构造方法,但是不能实例化(不能被显式调用,但JVM可以隐含调用)
作用是用于子类访问抽象类数据的初始化
成员方法
- 可以有抽象方法 限定子类必须完成某些动作
- 也可以有非抽象方法,用来提高代码复用性,子类可以继承
接口interface的引入
接口特点
接口用关键字interface表示
- 格式:interface 接口名 {} //不能使用class关键字了
类实现接口用implements关键字
- 格式:class 类名 implements 接口名 {}
接口没有构造方法,即:接口不能实例化
- 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,接口多态。
接口的子类
- 可以是抽象类,用implements关键字,
abstract class A implements ITest{} //抽象类和接口之间用实现
- 或者还是一个接口,用extends关键字
interface A extends ITest{} //接口和接口之间用继承
- 是一个实现类,实现接口中的所有抽象方法,用implements关键字
class B implements ITest{...} //实现类和接口之间用实现
小结:
只有接口和接口之间使用的是extends关键字,抽象类和接口之间,实现类和接口之间都是用的implements关键字
演示接口常规用法:
1.接口不能实例化对象
2.子类如果是实现类的话,就必须实现接口中定义的所有抽象方法
3.子类如果不完全实现接口中的抽象方法,那子类就是抽象类
4.接口和接口之间可以继承--extends
接口成员特点
成员变量
- 只能是常量
- 默认修饰符 public static final,其中的任何一个都可以省略,也可以全都省略
构造方法
没有,因为接口主要是扩展功能的,而没有具体存在
成员方法
- 只能是抽象方法
- 默认修饰符 public abstract,可以省略其中之一,或者都省略。
类与类,类与接口,接口与接口的关系
普通类与普通类--extends
- 继承关系,只能单继承,但是可以多层继承
普通类与抽象类--extends
- 继承关系,只能单继承,但是可以多层继承
普通类与接口,抽象类与接口--implements
- 实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口
- 此时应注意:extends 写在前,implements写在后
接口与接口--extends
- 继承关系,可以单继承,也可以多继承
抽象类和接口的区别
定义时使用的关键字
- 抽象类 abstract
- 接口 interface
成员区别
- 抽象类 变量,常量都可以有;抽象方法,非抽象方法都可以有;可以有构造方法
- 接口 只有常量;只有抽象方法;没有构造方法
关系区别
- 类与类 继承,单继承,多层继承
- 普通类与接口 实现,单实现或多实现implements
- 抽象类与接口 实现,单实现,多实现abstract class A implements IA,IB
- 普通类与抽象类 继承,并实现全部抽象方法extends
- 接口与接口 继承,单继承,多继承extends
总结:
在接口的各种关系中,只有接口和接口之间用的是继承,其余的和接口之间都是实现关系;
1、抽样方式定义格式,抽象方法定义时修饰符有哪些非法组合?
private abstract
抽象方法依靠子类去实现,但是私有方法在类外就不能访问,也就无法实现。
final abstract
final修饰的方法不能被重写,而抽样方法就是需要子类实现,矛盾。
static abstract
抽样方法在本类中是没有方法体的,使用类名调用的时候调用的是没有方法体的方法,无作用。
2、抽象类定义格式
抽象类和抽象方法必须用abstract关键字修饰
抽象类定义
abstract class 类名{}
抽象方法定义,在返回值前,或修饰符前加上abstract关键字
方法没有方法体,即:没有{}
abstract public void eat();
public abstract void eat();
3、抽象类是否必须有抽象方法?
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类。
抽象类完全可以有成员变量和非抽象成员方法。
4、抽象类中成员变量和成员方法有什么特点?
成员变量:可以是变量,也可以是常量(final);
成员方法:可以有抽象方法 限定子类必须完成某些动作;
也可以有非抽象方法,用来提高代码复用性,子类可以继承。
5、接口中成员变量和成员方法的特点?
成员变量:只能是常量;默认修饰符public static final,其中的任何一个都可以省略,也可以全都省略。
成员方法:只能是抽象方法;默认修饰符public abstract,可以省略其中之一,或者都省略。
6、接口与接口,接口与抽象类,接口与实现类的关系,分别使用什么关键字?
接口与接口——extends 继承关系,可以单继承,也可以多继承。
接口与抽象类——implements 实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口。
此时应注意:extends写在前,implements写在后
7、接口中成员变量默认的修饰符
public static final