抽象类
抽象方法:没有方法体的方法,并且使用abstract关键字修饰的方法
抽象类:用abstract修饰的类就是抽象类
abstract class Demo4 {
public void add(){
System.out.println("add...");
}
public abstract void minus();
}
继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该父类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,失去意义。
class Demo6 extends Demo4{
@Override
public void minus() {
System.out.println("minus...");
}
}
特点
- 有抽象方法的类一定是抽象类,但是抽象类不一定有抽象方法
- 抽象类是不可以直接创建对象的,但是可以通过其子类来创建对象
- 抽象类中有构造方法,但是不可以用来创建对象,但是可以供子类初始化父类的成员变量
- 抽象类的子类如果是普通类,那么必须实现抽象类中的抽象方法
为什么Java需要抽象类
java定义抽象类,是为了更好的继承,减少类与类之间的耦合。、
总之:抽象类就是为继承而生
接口
Java中的接口是特殊的抽象类,接口中只定义了方法,没有方法的实现。(ps:Java8以后可以有默认的实现),一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
总结:接口是一组行为的规范、定义,没有实现。
特点:
1、接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)。
public static final int NUMBER_COUNT = 12;
int NUMBER_COUNT_2 = 12;
2、接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化
public abstract void add();
void minus();
3、接口中没有构造方法,不能被实例化
4、一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口
public interface Demo01 {
public static final int NUMBER_COUNT = 12;
int NUMBER_COUNT_2 = 12;
public abstract void add();
void minus();
}
//接口Demo2
interface Demo2 {
}
//接口Demo3继承Demo2和Demo01
interface Demo3 extends Demo01,Demo2{
}
5、当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象类
abstract class Demo4 implements Demo01{
public void add(){
System.out.println("add...");
}
public abstract void minus();
}
class Demo5 implements Demo01{
@Override
public void add() {
System.out.println("add...");
}
@Override
public void minus() {
System.out.println("minus...");
}
}
为什么Java会有接口
-
一个类只能继承一个父类,但是可以实现一个或多个接口,弥补了java类不能多继承
-
屏蔽了实现的不同的差异
-
面向接口编程,利用接口解耦
抽象类与接口的区别
抽象类 | 接口 |
---|---|
抽象类在类名前使用关键字abstract声明,抽象类中变量和方法可以使用private/protected/public/final/static关键字修饰 | 接口在接口名称前使用interface关键字修饰 |
抽象类中可以没有抽象方法 | 接口中定义的变量是public static final的,必须初始化,实现类不可修改 |
抽象类中变量和方法可以使用private/protected/public/final/static关键字修饰 | 接口中的方法均为public(关键字通常省略),接口中方法可以没有方法体(此时是public abstract),也可以有具体实现,具体实现的方法但必须使用default关键字修饰 |
抽象类中可以有构造方法(默认或者自定义) | 接口中不可以有构造方法 |
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
- 子类使用extends继承一个抽象类,而一个类使用implements实现一个接口