一、抽象类
1. 概念:使用abstract关键字修饰的类。
2. 成员特点:
- 成员变量:既可以定义常量,也可以定义变量。
- 成员方法:既可以是非抽象方法,也可以是抽象方法。
- 构造方法:既存在有参构造,也存在无参构造方法。
3. 抽象方法:
被 abstract 修饰,并且在定义方法的时候,只是方法声明 ,没有方法体。
abstract class Animal{
// 抽象方法
public abstract void eat() ;
//非抽象方法
public void show() {
System.out.println("show Animal");
}
}
4. 注意事项:
- 抽象类中不一定有抽象方法,但是有抽象方法的类必须是抽象类
- 抽象类不能直接实例化 (创建对象 new 类名())
- 抽象类的子类:
- 1)可以是抽象类(没有覆盖重写父类中全部的抽象方法)
- 2)可以是具体类,全部重写父类的抽象方法,可直接创建对象
5. 抽象类可以不可以没有抽象方法呢? 它有什么意义呢?
- 可以没有抽象方法
- 目的是,不想让其直接实例化。 (想通过子类进行实例化)
6. abstract 关键字
-
与以下关键字冲突
1)private
2)static
3)final -
可以一起使用的关键字
1)public
2)protected
二、接口
1. 概述:
- 关键字:interface表示接口
- 接口体现的是一种扩展功能,需要让它子实现类实现该功能即可。
//跳高接口
public interface Jump{
public abstract void jump() ;
}
2. 特点:
- 成员变量只能是常量。
- 方法都是抽象方法,并且定义的时候默认修饰符public abstract(可以省略不写)。
- 接口不能实例化(不能创建对象)。
- 接口的子实现类格式:
子实现类名 implements(实现) 接口名{ }
// 创建子实现类实现Jump接口
public class Cat implements Jump{
@Override
public void jump() {
System.out.println("猫可以跳高");
}
}
-
接口的实例化动作需要借助于当前实现该接口的具体的实现类来完成
-
格式:
接口名 对象名 = new 子实现类名() ;
public class InterfaceDemo {
public static void main(String[] args) {
//Jump jump = new Jump() ;报错!接口欧类型不能实例化
//接口的子实现类是具体类
Jump jump = new Cat() ;
jump.jump();
}
}
三、接口和抽象类的区别
1. 成员区别.
抽象类的成员特点
- 成员变量:可以常量,也可以是变量
- 成员方法:可以抽象方法,也可以是非抽象方法!
- 构造方法:存在有参/无参构造, 对数据进行初始化
接口的成员特点
- 成员变量:只能是常量,存在默认修饰符:public static final
- 成员方法:只能是抽象方法,存在默认修饰符:public abstract
- 构造方法:没有,通过子实现类进行实例化
2. 关系区别.
- 类与类:
存在继承关系,只能单继承,不能多继承,但可以多层继承; - 类与接口:
存在实现关系,一个类可以多实现多个接口;
并且一个类继承另一个类的时候,也可以实现多个接口。 - 接口与接口:
存在继承关系,不仅可以单继承,还可以多继承。
3. 设计区别.
- 抽象类:继承,提高代码的复用性,体现一种“is-a”的关系。
- 接口:实现,提高代码的扩展性,体现一种“like-a”的关系。