论Java中的抽象类与接口
2020/01/14 10:23:32 来源:cnblogs.com/yhycoder 作者:coderyhy

抽象类和抽象方法

定义

//抽象方法,没有方法体(即没有{}),只有声明
abstract void f();
/**
 * @author yhy
 * 用来完成9.2的练习
 * 验证抽象类与抽象方法的使用
 */
public class YanZheng {
    public static void main(String[] args) {
//      不能被实例化,抽象类,会报错
//        ChouXiang chouxi = new ChouXiang() ;
//        可以实例child类
//        即通过继承其子类来实现不能继承抽象类
        Child test = new Child();
    }
}
abstract class AbstractChouXiang{
    /**
     * 构造函数
     */
    AbstractChouXiang() {
    }
    /**
     * 定义一个抽象类的抽象方法
     */
    abstract void chouxiang();
}
class Child extends AbstractChouXiang{
   Child(){
       System.out.println("实例时候就打印出来");
   }

    /**
     * 注意这里不是abstract就不要讲方法定义为abstract
     */
    @Override
    void  chouxiang(){
         System.out.println("继承抽象类");

    }
}

与普通类的区别以及注意点:

抽象类的作用

接口

定义

//省略public就变为默认级别,只能在当前包所访问
public interface Figure { 
//接口中静态成员变量
String name = "几何图形";//省略public static final 
// 绘制几何图形方法
void onDraw(); //省略public 这里是抽象方法
}

示例

import java.text.SimpleDateFormat;

/**
 * @author yhy
 * 这个是实现接口定义的代码,在其它地方去调用
 * 这里的接口不用public的话,其它的包就访问不了
 */
public interface JieKou {
//   定义了两个常量
    /**
     * 这里定义一个df变量来获取当前时间
     */
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
    String AUTHOR = "yhycoder";
    /**
     * 定义一个接口的方法
     * 这里的public是多余的,在接口里面是自动为public
     */
    /*public*/ void print();
}
//访问了其它包的接口,就是下面这个地址
import music.daima.ebook.JieKou;
import java.util.Date;

public class UseInterfaces {
    public static void main(String[] args) {
//实例化using类,实现查看代码的运行情况
        Using Shuchu = new Using();
        Shuchu.print();

    }
}

/**
 * 这里是接口继承接口
 */
interface Jiekou2 extends JieKou{
    String num = "接口2";
}

/**
 * 这里是Using类实现了JieKou和Jiekou2接口,逗号隔开
 */
class Using implements JieKou,Jiekou2 {
    /**
     * 重写了方法,调用接口定义的常量
     */
    @Override
    public void print() {
        System.out.println(AUTHOR+"在新的包里面使用接口的时间:"+df.format(new Date())+" 同时还有"+num);
    }
}

注意

  1. 接口与抽象类一样都不能被实例化
  2. 实现接口时接口中原有的抽象方法在实现类中必须实现。默认方法可以根据需要有选择实现(覆盖)。静态方法不需要实现,实现类中不能拥有接口中的静态方法。(Java 8之后)
//InterfaceA.java文件,定义一个接口 
public interface InterfaceA {
//抽象方法
    void methodA();
    String methodB();
// 默认方法
    default int methodC() {
    return "6666";
    }
// 默认方法
    default String methodD() {
    return "这是默认方法";
    }
// 静态方法
    static double methodE() {
    return 0.0;
    } 
}

实现接口代码

import xxxx.InterfaceA;
public class ABC implements InterfaceA {
    //重写
    @Override
    public void methodA() {
    }
    @Override
    public String methodB() {
    return "实现methodB方法...";
    }
    //重写覆盖,根据自己的需要来。
    @Override
    public int methodC() {
    return 500;
    } 
}
//实现类中不能有接口中的静态方法,最后一行
public class HelloWorld {
    public static void main(String[] args) {
//声明接口类型,对象是实现类,发生多态
    InterfaceA abc = new ABC();
// 访问实现类methodB方法
    System.out.println(abc.methodB());
// 访问默认方法methodC
    System.out.println(abc.methodC()); 
// 访问默认方法methodD
    System.out.println(abc.methodD()); 
// 访问InterfaceA静态方法methodE,这里不能通过实现类去使用接口的静态方法,只能通过接口名调用
    System.out.println(InterfaceA.methodE()); 
    } 
}

作用

  1. 规范,在分配不同人的任务时,接口就像是总纲一样,告诉大家去实现哪些功能模块等。(命名规范都有限制到)

最后:接口与抽象类的异同

不同

相同

使用场景


6

本栏最新