Java基础之抽象类和接口的区别(JDK1.8)
-
接口
定义:接口在java中是一个抽象类型,是抽象方法的集合。一个类通过继承(或实现)接口的方式,从而继承(或实现)接口的抽象方法。从定义上看,接口是个集合,并不是类。类描述了属性和方法,而接口只包含方法(未实现的方法)。
- 接口中不允许有构造方法。
- 接口中的成员变量默认是static final的。
- 在jdk1.8中接口中的抽象方法可以使用 default 和 static 修饰。使用 default 修饰的方法可以被子类重写,也可以被this调用。使用 static 修饰的方法只能由接口本身调用。
- 接口允许被多实现。(使用 implements 关键字。一个类可以实现多个接口)。
- 接口中的方法默认都是抽象的。但是不需要abstract关键字,且方法的访问修饰符可以是是public或者default。
-
抽象类
定义:使用[abstract](https://so.youkuaiyun.com/so/search?q=abstract&spm=1001.2101.3001.7020)修饰符修饰的类。(如果一个类没有包含足够多的信息来描述一个具体的对象,这样的类就是抽象类。)
-
抽象类被abstract修饰符来修饰。抽象类不能被实例化。只能被子类继承。可以有构造器。
-
抽象类的构造器不能用于创建实例,主要是用于被其子类调用。
-
抽象类中可以有包含成员变量、 方法(普通方法和抽象方法都可以)、 构造器、初始化块、 内部类(接 口、枚举)5种成分。
-
抽象方法没有方法体。形式如(public abstract void test()😉。只能由其子类进行重写。
-
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
-
abstract static不能同时修饰一个方法 (abstract方法没有方法体不能直接调用,static方法可以直接调用,冲突)
-
抽象类的内部类可以使用static进行修饰。
/**
* TestAbstract 抽象类 抽象类不能创建实例,只能当成父类来被继承。
* 1、抽象类必须使用abstract修饰符来修饰,
* 抽象方法也必须使用abstract修饰符来修饰,
* 抽象方法不能有方法体。
* 2、抽象类不能被实例化,
* 无法使用new关键字来调用抽象类的构造器创建抽象类的实例。
* 3、抽象类可以包含成员变量、
* 方法(普通方法和抽象方法都可以)、
* 构造器、初始化块、
* 内部类(接 口、枚举)5种成分。
* 4、抽象类的构造器不能用于创建实例,主要是用于被其子类调用。
* 5、抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类
* 6、abstract static不能同时修饰一个方法 (abstract方法没有方法体不能直接调用,static方法可以直接调用,冲突)
*/
public abstract class TestAbstract {
//抽象类的内部类可以使用static进行修饰.在子类进行继承该内部类时可以调用
static abstract class inner{
public abstract void eat();
}
}
class A extends TestAbstract.inner{
@Override
public void eat() {
System.out.println("eat方法执行了");
}
}
public class TestMain {
public static void main(String[] args) {
//向上转型。多态体现
TestAbstract.inner inner = new A();
inner.eat();
}
}
结果:eat方法执行了
-
抽象类和接口的区别总结
-
抽象类是通过abstract修饰符修饰的类。而接口是一系列抽象方法的集合。
-
抽象类只能被单继承。而一个类可以实现多个接口。
-
抽象类中可以有普通方法和抽象方法。抽象方法一定要用abstract进行修饰且没有方法体。普通方法有方法体。抽象类中可以存在有参和无参构造方法。这些构造方法只能由继承的子类在其内部进行初始化调用。接口中没有构造器。
-
抽象类的抽象方法必须在子类内重写。接口中的所有非静态抽象方法必须在实现该接口的类内全部重写。接口中可以存在静态方法。但只能由接口本身调用。
-
抽象类中可以存在普通成员变量、类变量。接口中的成员变量默认都是static final类型的。
-
有抽象方法不一定是抽象类,也可能是接口。抽象类不一定有抽象方法,可以有非抽象的普通方法。
-
-
抽象类和接口的使用场景
这个文章写的不错。可以看看增加对场景的应用理解。
搞了这么多年终于知道接口和抽象类的应用场景了 - 腾讯云开发者社区-腾讯云
如有错误,希望大佬批评指正