1.抽象类
1)什么是抽象类
抽象的反义词是具体,越不具体,就越抽象。abstract修饰的类就叫做抽象类,除了不能被实例化之外!其他语法规则和普通类都一样。
abstract关键字存在的意义,就是让程序员明确的告诉编译器,这个类是一个抽象的类,不应该进行实例化,于是编译器就要做好相关检查工作。
2)什么是抽象方法
- 给方法前头加上 abstract 此时这就是一个抽象方法了.
- 抽象方法不需要方法体.
- 抽象方法只能在抽象类中存在(也可以在接口中存在), 不能在普通的类中存在.
- 抽象方法存在的意义就是为了让子类进行重写.
3)举例
abstract class Animal{ //抽象类
public abstract void eat(); //抽象方法
}
public class Blog {
public static void main(String[] args) {
Animal animal=new Animal();
}
}
运行结果:
2.接口
1)什么是接口
我们知道,类之间只能单继承。为了实现类似“多继承”的效果,所以就引入了接口。接口是抽象类的更近一步,比抽象类还抽象。抽象类只是不能实例化,但是其他各个方面都和普通类差不多,接口就更抽象了,不光不能实例化,同时也不具备类的各种特性。
命名:接口的命名一般以大写字母I作为前缀,一般使用形容词进行命名。表示的语义:一个类具有XXX特性
2)举例
①接口中只能放抽象方法,不能放普通方法(下图中的波浪线~)
接口中的抽象方法可以不写public abstract关键字,写或者不写,都表示抽象的共有的方法~
但是抽象类中的抽象方法必须得写abstract关键字,抽象类中除了可以放抽象方法还可以放普通方法,所以不写得话就表示一个普通方法,就得加上方法体了。
②接口中只能放public static final修饰的属性,不能放普通的属性
interface IEating {
public static final String food = "fish";
}
③接口和类之间不能继承,只能是类实现了(implements)某个接口。接口和接口之间可以继承。
Animal类
public class Animal {
}
IEating接口
public interface IEating {
public static final String food = "fish";
public abstract void eat();
}
IJump接口
public interface IJump {
void jump();
}
Cat类继承自Animal类,实现了IEating,IJump接口
public class Cat extends Animal implements IEating,IJump{
@Override
public void eat() {
}
@Override
public void jump() {
}
}
注意:
- 实现的类必须重写接口中所有的方法。
- 实现多个接口,接口之前使用逗号分割。
3.抽象类和接口的对比
- 抽象类和普通类差不多,只是不能实例化。而接口和普通的类之间相去甚远(包含的属性,方法,和其它类的关系)
- 一个类只能继承自一个抽象类,但是一个类可以同时实现多个接口。
为啥要发明接口这样的语法?
解决Java中不能多继承的问题。Java中的继承是单继承,有些场景下多继承是有用的。Java中可以通过继承一个类,实现多个接口的方式来完成类似于多继承的效果。