abstract和接口

                                                                       abstract(抽象类)

  • 抽象类不可以被实例化,也就是不可以用new创建对象 ,但有构造方法构造方法是让子类进行初始化可以有成员属性和非抽象的成员方法。

  • 抽象类通过其子类实例化

  • 用abstract修饰的类就是抽象类。抽象方法必须定义在抽象类中。但是抽象类中不一定有抽象方法

  • 抽象类可以继承普通类与抽象类

  • abstract与其他修饰符的关系:

                     final与abstract不能共存:

                      final:它的作用 修饰类代表不可以继承 修饰方法不可重写

                      abstract修饰类就是用来被继承的,修饰方法就是用来被重写的。

                     final与 static不能共存

                      staic修饰的方法可以用类名调用(子类不能重写),对于abstract修饰的方法没有具体的方法实现,所以不能直接调用,也就是说不可以与static共存。

                     final与private不能共存

                     修饰的只能在本类中使用,abstract方法是用来被子类进行重写的,有矛盾所有不能共存

                                                                       接口(interface)

作用:Java不支持多继承,Java将多继承机制进行改良变成了多实现,可以弥补Java中单继承的缺点

  • 类与接口之间是实现关系,类实现接口

  • 接口不可以被实例化

  • 实现了接口的实现类必须重写接口中所有抽象方法后,这个子类才可以被实例化,否则报错。

  • 一个类可以实现多个接口,多个接口用逗号分隔,也可以不实现接口。

  • 一个类在继承另一个类同时,还可以实现多个接口

  •  接口中的成员修饰符是固定的:

           默认型:public static final 修饰的变量变常量,该值不能改变,只能读

  • 方法:接口中的方法只有定义而没有被实现(public abstract void write();  //抽象方法

  • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错),所以不能含有静态代码块以及静态方法(用 static 修饰的方法)

类实现接口的实例:

复制代码
//接口
public interface Pencil{
//    double PI=3.14;   //
    public static final double PI=3.14;  //静态常量,值一旦定义就不可以修改
    public abstract void write();  //抽象方法
}

//接口
public interface Eraser {
    
    public abstract void remove();  //清除的抽象方法
}

//可擦铅笔   实现多个接口
public class PencilWithEraser  implements Pencil,Eraser{

    //重写抽象方法
    @Override
    public void remove() {
         System.out.println("可以擦除文字");
    }

    //重写抽象方法
    @Override
    public void write() {
        System.out.println("正在写文字......");
    }
    
}

public class PencilWithEraserTest {
    public static void main(String[] args) {
//        PencilWithEraser pwe = new PencilWithEraser();
//        pwe.write();
//        pwe.remove();

        //类实现多个接口,使用接口类型接收new的对象,会出现 有的接口类型没有对应方法,进行强转对应的接口类型,常用的方法之一
        Pencil pwe = new PencilWithEraser();
        pwe.write();
        //不能调用 因为Pencil接口类型没有remove方法
        //pwe.remove();
        //强转成 Eraser 接口类型
        Eraser eas = (Eraser) pwe;
        eas.remove();
    }
}
复制代码

接口和接口的关系:接口与接口之间是继承关系,而且可以多继承

实例:

复制代码
//人类接口
public interface Person {
   public abstract void say();  //说的抽象方法 
}


public class Chinese implements Person{
    //重写接口中的抽象方法
    @Override
    public void say() {
        System.out.println("说中文");
    }
}

public class American implements Person{
    @Override
    public void say() {
       System.out.println("说英文");        
    }
}


public class PersonTest {
    public static void main(String[] args) {

        //使用接口做为类型,不再使用具体实现类作为类型, 但 new 还是要使用实现类
        //也是多态的表现之一
        Person chinese = new Chinese();
        chinese.say();
        Person american = new American();
        american.say();
    }
}
复制代码

接口与抽象类的区别

在Java中接口是一个比抽象类更加抽象的概念,由于只声明行为,因此在接口中的方法均是抽象的,下表中罗列了接口和抽象类的差异:


abstract class
interface
属性 不用限制 public 静态 final 常量
构造方法 可有可无 没有
普通方法 可以有具体方法 必须是public抽象方法
子类 单一继承 多重实现(接口继承接口时为多重继承)
  • 抽象类体现继承关系,一个类只能单继承

  • 接口体现实现关系,一个类可以多实现

  • 抽象类是继承 is a关系 (所属关系)在定义该体系的基本共性内容

  • 接口是实现是like a关系(不所属关系)在定义该体系额外功能

  • 接口可实现多继承原因分析:

    • 不允许类多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一个D方法,A无法确定该继承那一个

    • 接口全都是抽象方法,不存在实现冲突,继承谁都可以,所以接口可继承多个接口

 

posted @   任任不买鞋子  阅读(103)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示