Java 中的两种抽象定义: 一为抽象类(Abstract Class), 二为接口(Interface).
一, 抽象类 Abstract Class
抽象类是关键字 abstract 修饰的类, 既为抽象类, 抽象抽象即不能被实例化. 而不能被实例化就无用处, 所以抽象类只能作为基类(父类), 即被继承的类. 抽象类中可以包含抽象方法也可以不包含, 但具有抽象方法的类一定是抽象类.
抽象类的使用原则如下:
(1)被继承性: 抽象方法必须为 public 或者 protected(因为如果为 private, 则不能被子类继承, 子类便无法实现该方法), 缺省情况下默认为 public;
(2)抽象性: 抽象类不能直接实例化, 需要依靠子类采用向上转型的方式处理;
(3)抽象类必须有子类, 使用 extends 继承, 一个子类只能继承一个抽象类;
(4)子类 (如果不是抽象类) 则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法, 则必须将子类也定义为为 abstract 类.
比如:
- package com.fzz.test;
- // 抽象类 A
- abstract class A{
- public void fun(){// 普通方法
- System.out.println("存在方法体的方法");
- }
- public abstract void print();// 抽象方法, 没有方法体, 有 abstract 关键字做修饰
- }
- // 单继承特性
- class B extends A{//B 类是抽象类的子类, 是一个普通类
- @Override
- public void print() {// 强制要求重写
- System.out.println("Why is more important than what!");
- }
- }
- // 测试类
- public class TestDemo {
- public static void main(String[] args) {
- A a = new B();// 多态: 向上转型
- a.fun();// 被子类所覆写的过的方法
- }
- }
详细可参考: https://blog.csdn.net/wei_zhi/article/details/52736350
二, 接口 Interface
在 JAVA 编程语言中是一个抽象类型, 是抽象方法的集合, 接口通常以 interface 来声明. 一个类通过继承接口的方式, 从而来继承接口的抽象方法.
1, 接口与类相似点
一个接口可以有多个方法.
接口文件保存在 .java 结尾的文件中, 文件名使用接口名.
接口的字节码文件保存在 .class 结尾的文件中.
接口相应的字节码文件必须在与包名称相匹配的目录结构中.
2, 接口与类的区别
接口不能用于实例化对象.
接口没有构造方法.
接口中所有的方法必须是抽象方法.
接口不能包含成员变量, 除了 static 和 final 变量.
接口不是被类继承了, 而是要被类实现.
接口支持多继承.
3, 接口特性
接口中每一个方法也是隐式抽象的, 接口中的方法会被隐式的指定为 public abstract(只能是 public abstract, 其他修饰符都会报错).
接口中可以含有变量, 但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public, 用 private 修饰会报编译错误).
接口中的方法是不能在接口中实现的, 只能由实现接口的类来实现接口中的方法.
4, 接口的继承
当类实现接口的时候, 类要实现接口中所有的方法. 否则, 类必须声明为抽象的类. 类使用 implements 关键字实现接口. 在类声明中, Implements 关键字放在 class 声明后面.
Java 中类不允许多继承但接口可以.
- // 文件名: Sports.java
- public interface Sports
- {
- public void setHomeTeam(String name);
- public void setVisitingTeam(String name);
- }
- // 文件名: Football.java
- public interface Football extends Sports
- {
- public void homeTeamScored(int points);
- public void visitingTeamScored(int points);
- public void endOfQuarter(int quarter);
- }
- // 文件名: Hockey.java
- public interface Hockey extends Sports
- {
- public void homeGoalScored();
- public void visitingGoalScored();
- public void endOfPeriod(int period);
- public void overtimePeriod(int ot);
- }
三, 异同
abstract class 和 interface 是支持抽象类定义的两种机制. 正是由于这两种机制的存在, 才赋予了 Java 强大的面向对象能力. abstract class 和 interface 之间在对于抽象类定义的支持方面具有很大的相似性, 甚至可以相互替换, 因此很多开发者在进行抽象类定义时对于 abstract class 和 interface 的选择显得比较随意. 具体看下表:
来源: https://www.cnblogs.com/fzz9/p/8974403.html