目录
铁汁们好,今天我们学习抽象类和接口~
1. 抽象类
1.1 抽象类的概念
什么是抽象类?在面向对象中,如果一个类中的信息并不能完整地描述一个对象,这样的类就是抽象类,拿我们之前的例子:
Dog类和Cat类继承了Animal类,Animal中有eat方法,但是猫除了吃,还能抓老鼠,如果在Animal中加上抓老鼠的方法,那么狗继承了Animal,也就是说狗也能抓老鼠,这显然有点不现实,所以Animal并不能完整的描述一个对象,此时我们可以把它设计成抽象类,那么如何设计?
1.2 抽象类的语法
当一个类被abstract关键字修饰时,这个类就是抽象类
abstract class Animal{
//...
}
注意事项:
1.抽象类中可以包含普通的方法和属性,也可以包含构造方法
2.如果一个方法被abstract修饰,表示该方法是抽象方法,抽象方法不能有具体的实现,如
abstract class Animal{
public abstract void func();
}
1.3 抽象类的特点
抽象类有以下特点:
- 抽象类不能实例化:不能通过new来进行实例化
Animal animal = new Animal();
//错误的,抽象类不能实例化
-
抽象类中的抽象方法不能是private修饰的
-
抽象类中的抽象方法不能有具体实现,是因为抽象类的作用主要是被继承,子类需要重写抽象类中的抽象方法
abstract class Animal{
public abstract void func(){}//错误的,花括号就表示这个方法有具体实现
}
- 抽象方法不能是final和static修饰的(因为要被子类重写)
- 抽象类中可以没有抽象方法,但是抽象方法一定是在抽象类当中才能出现
2. 接口
2.1 接口的概念
接口是啥?在java中,可以认为是很多个类的公共规范,接口是一种引用数据类型.比如USB接口,安卓充电器接口,这些接口都是统一大小的,只要符合规范,大家都能使用它.
2.2 接口的语法
在java中,接口的定义和类的定义格式比较类似,将class替换成interface关键字即可
public interface 接口名{
//....
}
2.3 接口的特点
- 接口也不能实例化
- 接口中的方法都是抽象方法,是被public abstract修饰的,不能被其他修饰符修饰
- 接口中的方法不能有具体实现,只有加了default或者static的方法才能实现
例如:
interface IA {
static void fun1() {
System.out.println("static");
}
default void fun2() {
System.out.println("default");
}
}
- 接口中的成员变量默认是public static final修饰的,所以必须赋初始值
- 接口中的方法和变量一般不加修饰符,这样代码更加美观,清晰
如
interface IA {
int A = 10;
void func();
}
- 接口中不能出现静态代码块/构造方法/实例代码块
- 重写接口中的方法时,重写的方法只能是public的
- 当一个类需要实现某个接口时,使用implements关键字,而且这个类必须重写接口的方法
interface IA {
int A = 10;
void func();
}
class A implements IA{
@Override
public void func() {
}
}
2.4 实现多个接口
java中不能有多继承(一个类继承多个类),但是一个类可以实现多个接口,接口很好的解决了java不能多继承这个问题
interface IA {
//...
}
interface IB {
//...
}
class A implements IA, IB {
//...
}
2.5 接口的继承
接口之间也可以继承,接口之间的继承同样使用extends
interface IA {
//...
}
interface IB extends IA {
//...
}
3. 接口使用案例
父类Animal(抽象类)
public abstract class Animal {
protected String name;
protected int age;
public Animal(String name, int age) {
this.age = age;
this.name = name;
}
}
IFly接口
public interface IFly {
void Flying();
}
IRunning接口
public interface IRunning {
void Running();
}
子类(实现了IFly, IRunning接口,并且重写了接口中的方法)
public class Duck extends Animal implements IFly, IRunning {
public Duck(String name, int age) {
super(name, age);
}
@Override
public void Flying() {
System.out.println(this.name + "正在飞");
}
@Override
public void Running() {
System.out.println(this.name + "正在跑");
}
}