【JavaSE】抽象类和接口

目录

抽象类

抽象类的语法

抽象类特点

抽象类作用

接口

接口的语法

接口的使用

接口特点 


抽象类

面对对象中,所有的对象都是由类来描述的。但是,并不是所有的类都是描述对象的。如果一个类中没有足够的信息来描述一个具体的类,这个类就是抽象类。


抽象类的语法

//抽象类被关键字 abstract 修饰
abstract class Knowledge{
    //抽象类当中可以有一般的成员变量和方法
    int date;

    public void func(){
        System.out.println("这是一个一般的成员方法!");
    }
    //还可以有构造方法
    public Knowledge(){
        System.out.println("这是一个构造方法!");
    }

    //抽象方法被abstract修饰,不能有具体的功能
    //可以有任意个抽象方法,没有也可以
    //但是抽象方法只能是public所修饰
    //如果不写public,默认也是public
    public abstract void study();

}

抽象类特点

1.抽象类不能实例化对象 

2.抽象类只能被继承,若子类还是抽象类,父类当中的抽象类可以不用重写

                                   若子类不是抽象类,子类当中必须要重写父类当中的抽象方法

3.抽象方法不能被private、static、final关键字修饰。(重写的原因)

abstract class Knowledge{
    public abstract void study();
}

class Math extends Knowledge{
    @Override
    public void study() {
        System.out.println("学习数学知识!");
    }
}

class Chinese extends Knowledge{
    @Override
    public void study() {
        System.out.println("学习语文知识!");
    }
}

抽象类作用

抽象类最大的特点就是不能被继承,具体的功能由继承后的子类重写后的方法来完成。如果我们不小心用父类的方法,此时编译器就会报错。这就充分利用了编译器的检验。


接口

生活中的接口是公共的行为规范标准,实现接口时符合规范标准就可以通用。

Java中,接口是多个类的公共规范,是一种引用数据类型


接口的语法

//把class变成interface关键字就是接口
//接口名一般以大写字母I开头
public interface IName{

    //接口中的成员变量只能被 public static final 修饰
    //若是不写,会默认成 public static final
    //建议不加public static final,保持代码简洁性
    public static final int date = 0;
    double date2 = 1.0;

    //成员方法只能是抽象方法,被public abstract修饰
    //若是不写,会默认成 public abstract
    //建议不加public abstract ,保持代码简洁性
    void func();
    public abstract void func2();

}

接口的使用

interface IUsb{
    void openDevice();
    void closeDevice();
}

class Mouse implements IUsb{
    //实现接口必须要重写抽象方法
    @Override
    public void openDevice() {
        System.out.println("插入鼠标!");
    }

    @Override
    public void closeDevice() {
        System.out.println("拔出鼠标!");
    }

    public void clickMouse(){
        System.out.println("鼠标点击!");
    }
}

class Keyboard implements IUsb{
    public void openDevice() {
        System.out.println("插入键盘!");
    }

    @Override
    public void closeDevice() {
        System.out.println("拔出键盘!");
    }

    public void clickKeyboard() {
        System.out.println("键盘输入!");
    }
}

class Computer{
    public void openComputer(){
        System.out.println("打开电脑!");
    }

    //这里是电脑使用键鼠的方法
    //形参是满足usb接口规则的都可以使用电脑
    public void useDevice(IUsb usb){
        usb.openDevice();

        //因为usb接口中没有鼠标的点击功能
        //所以要强制类型转换成Mouse类(向下转型)
        //向下转型不安全,有可能失败,用instanceof关键字来判断是否成功
        if(usb instanceof Mouse){
            Mouse mo = (Mouse) usb;
            mo.clickMouse();
        }else if(usb instanceof Keyboard){
            Keyboard ke = (Keyboard) usb;
            ke.clickKeyboard();
        }
        usb.closeDevice();
    }
    public void closeComputer(){
        System.out.println("关闭电脑!");
    }
}


public class Test {
    public static void main(String[] args) {
        Computer co = new Computer();
        co.openComputer();
        co.useDevice(new Mouse());
        co.useDevice(new Keyboard());
        co.closeComputer();
    }
}

这里的鼠标与键盘的插入与拔出是相同的动作,所以可以设置成接口。


接口特点 

1.接口不能实例化对象,只能被类来实现。

2.接口相较于抽象类,更加纯粹,里面不能有成员变量,一般的成员方法。只能由final修饰的常量,没有具体功能的抽象方法。从JDK1.8开始,可以有default修饰的成员方法。相较于抽象类,没有了构造方法、静态代码块和实例代码块。

3.一个类可以实现多个接口。

4.接口与类之间用implements关键字,接口与接口之间的继承关系用extends

抽象类与接口最大的区别,我个人认为抽象类是描述的一个大类,比如动物。

接口则是纯粹的描述一个动作,方法。比如飞这个动作。

鸟是动物,飞机会飞,鸟也会飞,能飞的这个就可以作为一个接口。

有什么错误欢迎评论区指出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值