抽象类
1、什么是抽象类?
被abstract修饰的类叫抽象类
有抽象方法的类
2、什么是抽象方法?
没有方法体的方法称为抽象方法
3、抽象类的特点
-
抽象类和抽象方法都由abstract关键字修饰
-
抽象类可以没有抽象方法,但是有抽象方法的类一定是抽象类
abstract class A { public abstract void a(); public void b(){ } }
-
抽象类不能创建对象
-
一个类想要继承一个抽象类,要么该类也是一个抽象类,要么是一个普通类(必须抽象所有的抽象方法)
4、抽象类成员的特点
-
成员变量
可以有静态成员变量
可以有非静态成员变量
可以有自定义常量
-
成员方法
可以有抽象方法
可以有非抽象方法
-
构造方法
有构造方法
但是不能创建对象
为什么会有构造方法?
抽象类的构造方法是给子类调用,为了给抽象类中的成员变量进行初始化的,还提供给子类使用
5、abstract关键字不能和哪些关键字共存?
-
private
因为abstract修饰的方法是抽象方法,必须要被子类重写,如果该方法同时又被private修饰的话,子类就不能重写该方法了,所有冲突
-
static
因为被static修饰的方法可以直接通过类名去调用,如果该方法同时又被abstract修饰(没有方法体),调用没有方法体的方法???
-
final
因为abstract修饰的方法是抽象方法,必须要被子类重写,如果该方法同时又被final修饰的话,子类就不能重写该方法了,所有冲突
接口
1、什么是接口?
比抽象类更加抽象的表现形式,称为接口
2、定义格式
interface A {
}
接口不是类
3、接口的特点
- 不能创建对象
- 一个类想要实现一个接口,要么该类也是一个抽象类,要么是一个普通类(必须抽象所有的抽象方法)
4、成员特点
-
成员变量
全是自定义常量
默认修饰符:public static final
-
成员方法
接口中所有的方法都是抽象方法(错误的解释)
-
构造方法
接口中没有构造方法
5、接口与接口,类与类,类与接口
- 类与类:继承,单继承
- 接口与接口:继承,多继承
- 类与接口:实现,可以多实现
6、什么时候使用接口,什么时候使用类(包含抽象类)?
当两个类之间存在“ is a ”的关系,就要定义类,两个类之间是继承关系
abstract class Animal {
public abstract void eat();
public void drink() {
System.out.println("喝水");
}
public void sleep() {
System.out.println("睡觉");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("吃肉");
}
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("吃鱼");
}
}
class Pig extends Animal {
@Override
public void eat() {
System.out.println("吃白菜");
}
}
接口是额外扩的功能,该类本身不存在此功能,而且不是is a 的关系就需要使用接口
abstract class Animal {
public abstract void eat();
public void drink() {
System.out.println("喝水");
}
public void sleep() {
System.out.println("睡觉");
}
}
class Dog extends Animal implements Aircraft {
@Override
public void eat() {
System.out.println("吃肉");
}
@Override
public void fly() {
System.out.println("狗穿上飞行器就能飞");
}
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("吃鱼");
}
}
class Pig extends Animal {
@Override
public void eat() {
System.out.println("吃白菜");
}
}
/**
飞行器
*/
interface Aircraft {
void fly();
}
7、接口与抽象类
相同点
- 不能创建对象
- 都有抽象方法,并且必须被子类,或实现类重写
不同点
-
关键字不同
接口:interface
抽象类:abstract
-
成员变量不同
接口:常量,public static final xxx
抽象类:普通变量,静态变量,常量
-
成员方法不同
接口:抽象方法(JDK1.8以后可以定义静态方法)
抽象类:普通方法,静态方法,抽象方法
-
构造方法不同
接口:没有构造方法
抽象类:有构造方法,但不能创建对象