抽象类和接口--简单讲解

抽象类

  • 抽象类:用abstract关键字来修饰一个类时,该类叫做抽象类。

    abstract class 类名 {
        属性定义;
        方法定义; = 抽象方法+非抽象方法
    }
    
  • 抽象类可以用于声明,但不允许创建对象。

        abstract class MyClass{ } //抽象类
         MyClass m1; //正确
         m1 = new MyClass(); //错误
    
  • 抽象类必须被继承,从而创建子类对象。

         abstract class MyClass{
             int value;
                 public void test(){
                     System.out.println("this is test()");
                }
                public abstract void test1();
         }
        class MySubClass extends MyClass{    }
    
        MyClass mc;
        mc = new MySubClass(); //正确
    
  • 抽象类只能作为其他类的超类,这一点与final类正好相反。

抽象类的定义规范

  • 含有抽象方法的类必须被定义成抽象类;
  • 抽象类中不一定要有抽象方法;
  • 构造方法耍有avstract;

抽象方法

  • 用abstract来修饰一个方法时,该方法叫做抽象方法。
    • 抽象方法必须被重写;
    • 抽象方法只有声明,不能有实现。
    • 定义了抽象方法的类必须是抽象类。
    • 语法:
      • abstract返回值类型 方法名(参数列表);

抽象方法特点

  • 抽象方法由子类实现:

    abstract class MyClass{
        int value ;
        public abstract void test();
    }
    class MySubClass extends MyClass{
        public void test(){
        System.out.println(" this is test() ");
        }
    }
    /*
     * 抽象类的子类要么实现所有的抽象方法,要么就也声明为抽象类。
     *  abstract class MySubClass extends MyClass{ *  
     *  }
     * /
    ------------------------
    public class TestAbstract {
         public static void main(String args[]){
           MyClass m = new MySubClass();
           m.test(); //按照多态的特点 执行子类覆盖的方法 
         }
    }
    

抽象类的应用

这里写图片描述

抽象类的好处

  • 描述抽象的概念
  • 抽象类的抽象方法约定了多个子类共用的方法声明
  • 不同的子类可以有不同的抽象方法实现,这样体现了OO的多态性

接口

  • 在构建问题的类过程中,我们经常会遇到一种特殊的情况,在表述某个类的各个方法时,对每个方法我们只能给其他功能实现的要求(原形声明)但不能给出具体的功能实现(函数定义体)。以为我们所处理的问题只是一个泛泛的功能说明,并没有针对某一具体类型的问题来说明。
    这里写图片描述

接口的定义

  • 类似于类的定义格式,只是以 interface作为定义符;
  • 格式:

    [public] interface 接口名
    {}
    或者
    [public] interface 派生的接口名 extends 父接口名类表
    {}
    

接口中的成员

  • 接口是一个特殊的抽象类

    [public] interface 接口名 [extends 父接口]
    {
    [public] [static] [final] 类型 追中变量名 = value;  //常量名
    ......;
    [public] [abstract] 返回值类型 方法名 (参数表);//抽象方法说明
    ......;
    }
    

    这里写图片描述

接口的实现

  • implements 关键字

    class MyClass implements MyInterface{
            public void m1(){}
            public void m2(){}
    }
    MyClass m1=new MyClass();
    MyInterface m2=new MyClass();//多态
    

接口的特点

  • 接口的继承,接口继承接口使用extends关键字

    interface IA{
        void m1();
    }
    interface IB extends IA{
        void m2();
    }
    public class MyClass implements IB{
        public void m1(){}
        public void m2(){}
    }
    
  • 接口的多继承

    interface IA{
         void m1();
    }
    interface IB {
         void m2();
    }
    interface IC extends IA,IB {
         void m3();
    }
    
  • 子类的多实现

    interface IA {
       void m1();
    }
    
    interface IB {
       void m2();
    }
    
    class MyClass implements IA, IB {
            public void m1() {
                System.out.println("this is m1()");
            }
             public void m2() {
                 System.out.println("this is m2()");
            }
    }
    
  • 子类的多实现的同时还可以继承一个父类

    interface IA {
      void m1();
    }
    
    interface IB {
          void m2();
    }
    
    class CC{
          void m3(){};  
    }
    class MyClass extends CC  implements IA,IB {
       public void m1(){
            System.out.println("this is m1()");
         }
          public void m2(){
               System.out.println("this is m2()");  
         }
        //方法的覆盖
          public void m3(){
              System.out.println("this is m3()");
         }
    }
    

使用接口的好处

  • 增加程序的通用性(多态作用)
    • 声明引用时要使用接口类型
    • 方法的参数要声明成接口类型
    • 方法的返回值要声明成接口类型
  • 接口的方法约定了多个实现类共用的方法声明(定义规范)
  • 不同的实现类可以有不同的接口方法实现,这样体现了OO的多态性
  • 面向接口编程降低了程序之间的耦合度(高内聚、低耦合)–汽车vs发动机
  • 接口实现了特殊的多继承
    这里写图片描述

接口和抽象类

  • 相同点
    • 都包含抽象方法
    • 都不能被实例化
    • 都是引用数据类型
  • 不同点
    • 约定
      • 抽象类:约定了多个子类共同使用的方法
      • 接 口:约定了多个互不相关的类之间共同使用的方法
    • 继承性
      • 抽象类与子类之间采用单继承机制
      • 一个类实现多个接口则可以实现多继承
    • 结构
      • 抽象类中可以包含非抽象方法,也可以声明构造方法
      • 接口中的方法全是抽象方法,不能声明构造方法
    • 访问权限
      • 抽象类具有和普通类一样的访问权限
      • 接口和类也是一样的访问权限,但是成员只能是public权限
    • 成员变量
      • 抽象类中可以声明成员变量,子类可以对成员变量赋值
      • 接口只能是常量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦修的木鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值