一、抽象类
1.语法规则
在 Java 中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用 给出具体的实现体。
// 抽象类:被abstract修饰的类 public abstract class Shape { // 抽象方法:被abstract修饰的方法,没有方法体 abstract public void draw(); abstract void calcArea(); // 抽象类也是类,也可以增加普通方法和属性 public double getArea(){ return area; } protected double area; // 面积 }
注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法
2.抽象类的特性
1. 抽象类不能直接实例化对象,否则会编译出错。
2. 抽象方法不能是 private 的,因为抽象类是需要被继承的,所以不能设置为私有的。 如果抽象方法没有加访问限定符时,默认是public.
3. 抽象方法不能被 final 和 static 修饰,因为抽象方法要被子类重写。
4. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰。
5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类。
6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量。
3.作用
抽象类本身不能被实例化 , 要想使用 , 只能创建该抽象类的子类 . 然后让子类重写抽象类中的抽象方法 . 但是 普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法
呢?
使用普通类也能够做到,但是使用抽象类相当于 多了一重编译器的校验。
二、接口
1.语法规则
接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。
public interface 接口名称{ // 抽象方法 public abstract void A(); // public abstract 是固定搭配,可以不写 public void B(); abstract void C(); void D(); // 注意:在接口中上述写法都是抽象方法,推荐方式4( void D();),代码更简洁 }
2.接口的使用
接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系。
3.接口特性
1. 接口不能实例化。
2. 接口中每一个方法都是 public 的抽象方法 , 即接口中的方法会被隐式的指定为 public abstract (只能是public abstract,其他修饰符都会报错 )。
3. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
4. 重写接口中方法时,不能使用 default 访问权限修饰,因为接口默认是public,子类重写时,子类的访问权限要大于等于父类的权限。
5. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量。
6. 接口中不能有静态代码块和构造方法。
7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是 .class。
8. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类。
9. jdk8 中:接口中还可以包含 default 方法。
4.实现多个接口
在 Java 中,类和类之间是单继承的,一个类只能有一个父类,即 Java 中不支持多继承 ,但是 一个
类可以实现多个接 口。一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置
为抽象类 。
5.接口间的继承
在 Java 中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:
用接口可以达到多继承的目的。接口可以继承一个接口, 达到复用的效果 . 使用 extends 关键字。
接口间的继承相当于把多个接口合并在一起。
interface A extends A1, A2, A3 { }
三、抽象类和接口的区别
抽象类和接口都是 Java 中多态的常见使用方式。
抽象类中可以包含普通方法和普通字段 , 这样的普通方法和字段可以被子类直接使用 ( 不必重写 ), 而 接口中不能包含普通方法, 子类必须重写所有的抽象方法。
总结
抽象类:
1.抽象类使用abstract修饰。
2.抽象类中可以包含普通类中所包含的成员。
3.抽象类与普通类不一样的是,抽象类可以包含抽象方法。
4.抽象方法使用abstract修饰,抽象方法可以没有具体的实现。
5.不能实例化抽象类。
6.抽象类存在的意义就是为了被继承。
7.如果一个普通类继承了一个抽象类,那么普通类就必须重写抽象类当中的方法。
8.如果一个抽象类A继承了一个抽象类B,此时A当中不需要重写B当中的抽象方法,但是如果A再被普通类继承,就需要重写。
9.抽象方法不能是私有的,要满足重写的规则。
10.抽象类当中可以有构造方法,是为了方便子类能够调用,来初始化抽象类中的成员。
接口:
1.使用interface来修饰接口。
2.接口当中的成员方法不能有具体的实现:默认是public abstract 的方法;JDK8开始,允许有可以实现的方法,但这个方法只能是由default修饰。可以实现有一个静态方法。
3.接口中的成员变量默认是 public static final 修饰的。
4.接口不能被实例化。
5.类与接口之间采用implements来实现多个接口。
6.子类重写抽象方法,必须加上public。
7.接口中不能有静态代码块和构造方法。
8.如果不想实现接口的方法,可以把这个类定义为抽象类,但是这个类如果被其它类继承,就需要重写。
9.一个类可以实现多个接口,使用implements,用逗号隔开,这样可以解决多继承的问题。