zoukankan      html  css  js  c++  java
  • Java 抽象类和接口

    抽象类

    抽象类就是指在普通类的结构里面增加抽象方法的组成部分。
    拥有抽象方法的类一定属于抽象类,抽象类要使用abstract声明。
    抽象类不能实例化。
    抽象类必须有子类,子类如果不是抽象类,那么必须覆写抽象类的全部抽象方法。
    任何类中存在static方法的时候可以不需要实例化直接调用方法(类.static方法)

    接口

    如果一个类之中只是由抽象方法和全局常量所组成,那么在这种情况下不能定义为抽象类,只能定义为接口。
    定义接口:

    interface A
    {
    	//全局常量
    	public static final String STR = "Hello World!";
    	//抽象方法
    	public abstract void fun();
    }
    

    接口存在抽象方法,不能直接实例化。

    • 接口必须存在子类,此时一个子类可以使用implements关键字实现多个接口;
    • 接口的子类如果不是抽象类,必须覆写接口中的全部抽象方法;
    • 接口的对像可以利用子类对象的向上转型操作实现。
    package com.testInterface;
    
    interface A
    {
    	public static final String STR = "Hello World";
    	public abstract void funA();
    }
    interface B
    {
    	public abstract void funB();
    }
    class X implements A,B
    {
    
    	//实现接口A的抽象方法
    	public void funA()
    	{
    		System.out.println("A接口的抽象方法");
    	}
    
    	//实现接口B的抽象方法
    	public void funB() 
    	{
    		System.out.println("B接口的抽象方法");
    	}
    	
    }
    public class TestDemo 
    {
    	public static void main(String[] args) 
    	{
    		X x =new X();
    		System.out.println(x instanceof A);
    		System.out.println(x instanceof B);
    		System.out.println(x instanceof X);
    	}
    }
    

    结果

    true
    true
    true
    

    对象x即是X类,也是A、B接口。

    如果子类除了接口之外,还要继承抽象类,语法先使用extends继承,而后使用implements实现。

    class X extends C implements A,B
    

    对于接口而言,只有抽象方法和全局常量,并且在方法上是否写public结果都一样,
    全局常量也可以不写public static final
    下面两种接口的定义完全相同。

    interface A
    {
       public static final String STR = "Hello World";
       public abstract void funA();
    }
    
    interface A
    {
       String STR = "Hello World";
       void funA();
    }
    

    一个抽象类可以继承一个抽象类,一个接口却可以使用extends同时继承多个接口(但是接口不能继承抽象类,因为如果继承抽象类的话就必须实现其中的抽象方法,而接口中只能是抽象方法)。

    • 接口的主要功能是解决单继承局限问题。
    • 接口里面可以定义普通内部类,抽象内部类 ,内部接口。
    • 在一个接口里面如果使用了static去定义一个内部接口表示是一个外部接口。

    接口在实际的开发中的三大核心作用:

    • 定义不同层之间的操作标准;
    • 表示一种操作能力;
    • 表示将服务器端的远程方法视图暴露给客户端。

    抽象类和接口的区别

    No. 区别 抽象类 接口
    1 关键字 abstract class interface
    2 组成 构造方法、普通方法、抽象方法、static方法、常量、变量 抽象方法、全局常量、default方法(1.8+)
    3 子类使用 class 子类 extends 抽象类 class 子类 implements 接口,接口…
    4 关系 抽象类可以实现多个接口 接口不能继承抽象类,却可以继承多个父接口
    5 权限 可以使用各种权限 只能使用public权限
    6 限制 一个子类只能继承一个抽象类(单继承局限) 没有单继承局限
    7 子类 抽象类和接口必须有子类,子类必须实现所有抽象方法
    8 实例化 依靠子类的向上转型进行对象的实例化

    No. 区别 抽象类 接口
    1 关键字 abstract class interface
    2 组成 构造方法、普通方法、抽象方法、static方法、常量、变量 抽象方法、全局常量、default方法(1.8+)
    3 子类使用 class 子类 extends 抽象类 class 子类 implements 接口,接口…
    4 关系 抽象类可以实现多个接口 接口不能继承抽象类,却可以继承多个父接口
    5 权限 可以使用各种权限 只能使用public权限
    6 限制 一个子类只能继承一个抽象类(单继承局限) 没有单继承局限
    7 子类 抽象类和接口必须有子类,子类必须实现所有抽象方法 相同
    8 实例化 依靠子类的向上转型进行对象的实例化 相同

    经过比较可以发现,抽象类中支持的功能绝对要比接口更多,但是抽象类不能多继承,这就掩盖里抽象类的所有优点,即:当抽象类和接口都可以使用的时候,优先使用接口。
    不成文的参考:

    • 在进行某些公共操作的时候一定要 定义接口;
    • 有了接口就需要子类完善方法;
    • 如果是自己写的接口,那么绝对不要使用关键字new实例化接口,利用工厂设计模式。
    --------------- 我每一次回头,都感觉自己不够努力,所以我不再回头。 ---------------
  • 相关阅读:
    牛客 Wannafly 挑战赛26D 禁书目录 排列组合 概率期望
    UOJ#269. 【清华集训2016】如何优雅地求和
    斯特林数 学习笔记
    AtCoder Grand Contest 006 (AGC006) C
    Codeforces 1045D Interstellar battle 概率期望
    Codeforces 1045A Last chance 网络流,线段树,线段树优化建图
    Codeforces 1053C Putting Boxes Together 树状数组
    Codeforces 109D String Transformation 字符串 哈希 KMP
    AtCoder Grand Contest 1~10 做题小记
    AtCoder Grand Contest 002 (AGC002) F
  • 原文地址:https://www.cnblogs.com/zjw-blog/p/13631822.html
Copyright © 2011-2022 走看看