抽象类
抽象类:用abstract修饰的类叫做抽象类。
在讲抽象类之前有必要强调一下abstract修饰符:
- abstract修饰的类为抽象类,此类不能有对象,(无法对此类进行实例化,说白了就是不能new);
- abstract修饰的方法为抽象方法,此方法不能有方法体(就是什么内容不能有);
抽象类的示例代码:
测试结果:
注意:抽象类不能被实例化,只有具体类才能被实例化。
接口
接口就是一个规范和抽象类比较相似。它只管做什么,不管怎么做。通俗的讲,接口就是某个事物对外提供的一些功能的声明,其定义和类比较相似,只不过是通过interface关键字来完成。
比抽象类更加抽象的是接口,在接口中所有的方法都是抽象的。
其中重要的几个知识点:
- 在接口中成员变量都静态成员变量,即省略了public static final修 饰符。
- 接口中的所有方法默认为抽象方法,即省略了public关键字。
- 声明接口使用interface关键字,interface前面的修饰符是public或省略。
- 某个类实现接口时,要在声明时使用implements关键字,当实现多个接口之间用逗号(,)分隔。
- 实现 接口时要实现接口中声明的所有原有的抽象方法。
接口的示例代码:
测试结果:
上述代码中实例化两个具体类MilkTeaa和beanTea,对象tea和tea2是Figure接口引用类型。
注意:接口与抽象类一样都不能被实例化。
接口与多继承
在Java中只允许继承一个类,但可实现多个接口。通过实现多个接口方式满足多继承的设计需求。如 果多个接口中即便有相同方法,它们也都是抽象的,子类实现它们不会有冲突。
抽象类与接口区别
- 接口支持多继承,而抽象类(包括具体类)只能继承一个父类。
- 接口中不能有实例成员变量,接口所声明的成员变量全部是静态常量,即便是变量不加public static final修饰符也是静态常量。抽象类与普通类一样各种形式的成员变量都可以声明。
- 接口中没有包含构造方法,由于没有实例成员变量,也就不需要构造方法了。抽象类中可以有 实例成员变量,也需要构造方法。
- 抽象类中可以声明抽象方法和具体方法。Java 8之前接口中只有抽象方法,而Java 8之后接口中 也可以声明具体方法,具体方法通过声明默认方法实现。
面试常考问题:
1.接口与抽象类在应用上的区别?
接口更多的是在系统架构设计方面发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用。
2.abstract class 与 interface有什么区别:
含有abstract 修饰的类即为抽象类,抽象类不能被实例化
抽象类中可以有抽象方法,抽象方法必须在子类实现,如果子类没有完全实现父类的抽象方法,那么子类也必须是abstract修饰
其实抽象类与普通类的区别就在于它不可被实例化和它可以有抽象的方法。
3.下面比较一下二者的语法区别:
(1)抽象类内可以有构造方法,接口中不可以有构造方法
(2)抽象类中可以有普通的非抽象方法,而接口中的所有方法都必须是抽象的。
(3)访问类型不同,抽象类的抽象方法可以是public 和 protected ,接口内的方法只能是public ,并且默认就是public abstract
(4)抽象类可以包含静态方法,接口中没有
(5)抽象类和接口中都可以包含静态成员变量,在抽象类中静态成员变量的访问类型任意,而接口中只能是public static final
(6)一个类可以实现多个接口,但是只能继承一个抽象类
中都可以包含静态成员变量,在抽象类中静态成员变量的访问类型任意,而接口中只能是public static final
(6)一个类可以实现多个接口,但是只能继承一个抽象类
(7)接口可以继承接口,抽象类可以实现接口