抽象类和接口

一、抽象类

1、抽象类概念、注意事项、作用(核心:抽象类不能被实例化,抽象方法要被重写):
(1)被abstract修饰的类叫抽象类
(2)抽象类当中可以有抽象方法,抽象方法也被abstract修饰,该方法可以没有具体的实现,因为抽象方法要被重写
public abstract void draw();
(3)抽象方法所在的类一定是抽象类
(4)抽象类不可以被实例化,只能被继承(必须被继承),继承后子类要重写父类所有的抽象方法,否则子类也是抽象类(要用abstract修饰)
(5)普通类继承抽象类之后,普通类一定要重写这个抽象类当中所有的抽象方法
(6)抽象方法不能被final、private、static修饰,因为抽象方法要被重写
(7)当抽象类A不想被普通类B继承时,可以把普通类B变成抽象类(加abstract修饰),再当普通类C继承抽象类B之后,C要重写B和A里面所有的抽象方法
(8)抽象类的构造方法用来让子类实例化对象时调用,帮助这个抽象类初始化自己的成员
(9)抽象类作用:抽象类不能被实例化,只能让子类重写抽象类中的抽象方法,使用抽象类相当于多了一重编译器的校验。如实际工作时应由子类完成,此时如果不小心用成父类了,父类是抽象类在实例化的时候就会提示错误,让我们尽早发现问题。这种预防出错的语法,类似于final,创建的变量用户不用去修改,相当于常量,加上final能够在我们不小心去修改这个变量的时候,让编译器提醒我们

二、接口

1、接口使用细节和注意事项:
(1)使用interface定义接口,这里接口的名字是USB,接口名字一般用I开头,如IShape
(2)接口中的成员变量默认由public static final修饰,一般情况下我们不写public static final
(3)接口中的成员方法默认由public abstract修饰(抽象方法),一般情况下我们不写public abstract
(4)接口中不可以有普通的成员方法,如:

public void test(){
}

(5)如果在接口里要有一个普通的成员方法,则这个普通的成员方法前要有default修饰。从Java8开始,可以在接口中定义一个default修饰的普通成员方法,这个方法里可以有具体的实现

default void test(){
System.out.println("test()");
}

(6)从Java8开始,接口当中被static修饰的成员方法,和(5)一样也可以有具体的实现

static void test2(){
System.out.println("static");
}

(7)从Java8开始,接口中每个方法默认都是由public修饰,default和static不能同时修饰接口方法
(8)接口类型是引用类型,接口比抽象类更抽象,不能通过new关键字来进行实例化
(9)类和接口之间可以通过implements(使生效)来实现,在类中重写接口中的方法,接口和类之间也可以发生向上转型、动态绑定、向下转型

interface USB{
    void openDevice();
    void closeDevice();
}
class KeyBoard implements USB{
    @Override
    public void openDevice(){
        System.out.println("打开键盘");
    }
    @Override
    public void closeDevice(){
        System.out.println("关闭键盘");
    }
    public void inPut(){
        System.out.println("键盘输入");
    }
}
class Computer{
    public void useDevice(USB usb){//向上转型
        usb.openDevice();//动态绑定
        if(usb instanceof KeyBoard){
            KeyBoard keyBoard =(KeyBoard)usb;//向下转型
            keyBoard.inPut();
        }
        usb.closeDevice();//动态绑定
    }
    public static void main(String[] args){
        Computer computer = new Computer();
        computer.useDevice(new KeyBoard());//使用键盘
    }
}

(10)类在实现接口时,要重写接口中的方法,重写的方法一定由public修饰(类似于重写方法的访问权限高于或等于父类中被重写方法的访问权限)
(11)接口中不能有构造方法和代码块
(12)接口虽然不是类,但接口编译完成后生成的字节码文件后缀也是.class
(13)如果类中没有重写接口中所有的抽象方法,则类必须设置为抽象类
2、先继承一个类再实现多个接口

public class Dog extends Animal implements IRunning,ISwimming{
}

3、接口的好处:使类的使用者不必关注类的类型,而只关注类是否具备某种能力(使向上转型更加灵活)

public static void test2(IRunning iRunning){
    iRunning.run();
}
test2(new Robot());

4、用extends拓展接口的功能(接口之间的继承,把多个接口合并在一起),如D接口具备B接口和C接口的功能、同时有自己的功能

interface D extends B,C{
    void testD();
}

这时实现接口D的类要重写D、B、C中的方法

三、抽象类和接口的区别:

1、接口中的成员变量默认是public static final,而抽象类中的成员变量可以是普通成员变量
2、接口中的成员方法默认是public abstract,而抽象类中的成员方法可以是抽象的,也可以是非抽象的
3、一个类可以继承一个类同时实现多个接口(用extends和implements),而接口与接口之间只能继承(只能用extends,可以继承多个接口)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值