抽象类和接口


一、抽象类

抽象类是用来描述一种类型应该具备的基本特征和功能,具体如何去完成需要子类方法的重写来完成。
比如:人都有吃东西和走路两个行为,但具体怎么吃,如何走路,还要具体到某个人来说。
所以抽象方法只有方法的声明,没有方法体。有抽象方法的类一定是抽象类。

public abstract class Animal {
    //吃东西
    public abstract void eat();
    //叫
    public abstract void call();

}
public class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    @Override
    public void call() {
        System.out.println("喵喵喵");
    }
}

```java
public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }

    @Override
    public void call() {
        System.out.println("汪汪汪");
    }
}

1、抽象方法的使用

抽象方法不能直接创建对象,只能子类继承后创建子类对象。
所以抽象方法不能用finally来修饰,用了子类就无法重写这个方法了。由于父类没有具体的实现,所以重写不是方法的加强,而是方法的具体实现其功能。

2、抽象类的注意事项

  • 抽象类的抽象概念,就是我们把一类事物共有的功能,聚集在一起,方便我们之后的使用,使得有更好的复用性和扩展性。
  • 抽象类具有构造方法,这个构造方法用来方便自身的初始化,方便子类的使用。
  • 抽象类的继承,子类需要重写抽象类中的所有抽象方法,才能进行实例化(就是new),如果有未实现的,就不能创建对象。
    抽象类不一定含有抽象方法,但含有抽象方法的一定是抽象类。并且抽象类也可以有普通方法。
  • 抽象类只有方法和属性的声明,没有具体的内容,我们不能直接创建该类的对象。必须定义子类才能进行使用。
  • 抽象类不能用abstract修饰属性,私有方法,构造器,静态方法,fainal方法。

二、接口

接口的概念:接口是一些列方法的声明,是一些方法特征的集合。一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些方法可以有不同的功能。接口中全部是全局常量和抽象方法,可以解决java无法多继承这个问题。

1、接口的特点

  1. 接口就是描述一种能力(比如运动员的跳远,跨栏,跳高,运动员如果要想跳高,就要去实现跳高这个接口,这样我才能承认你拥有这种能力)
  2. 如果一个类实现了一个接口中的所有方法,但没有提供方法体只有方法的标识,那么这个类一定是抽象类(所以抽象类和接口都能继承接口),注意:抽象方法只能存在于抽象类和接口中,但是抽象类中可以有普通方法,但是接口中百分比是抽象方法。
  3. java类库中接口的例子Comparator接口,这个接口代表具有能够比较这种能力,任何类只要继承了Comparator接口,就具备了比较这种能力,就可以进行排序了。

2、为什么要使用接口

  1. 接口可以用来解耦合,减低类之间的联系。
  2. 接口就是一种抽象,方便我们来实现
  3. 接口是一种实现多继承的方式。

3、接口实现

接口中常量的声明默认是public static final,方法的默认声明是public。所以接口中的属性都是常量需要一开始就赋值,并且不能对值进行改变。接口中的方法也都一定是公共的抽象方法,不能有方法体,具体的实现需要实现这个接口的类去实现。

//跳高的能力
public interface Jump {
    public static final int len = 10;

    public void jump();

}
//跑步的能力
public interface Run {
    int time = 20;

    void run();

}
//具体的运动员来实现这些接口,从而拥有这些能力
public class SportsMan implements Jump,Run{
    @Override
    public void jump() {
        System.out.println("能够跳高");
    }

    @Override
    public void run() {
        System.out.println("可以跑步");
    }
}

3、接口实现的具体实例

需求说明:原始的手机,可以发短信,通话。随着发展,手机增加了音频、视频播放、拍照、上网功能。按照作业3的思路和下面的类图进行程序设计:首先,编写类及接口,参照以下类的结构图;其次,编写测试类,让普通手机播放音频、发信息和通话,让智能手机上网、播放视频、照相、发信息和通话。

//照相
public interface Photograph {
    void takePicture();

}
//连接网络
public interface Network {

    void networkConn();

}

//播放
public interface PlayWiring {

    void play(String content);
    
}
//手机
public abstract class Phone {
    String brand;
    String type;

    public abstract void sendInfo();
    public abstract void call();
    public abstract void info();
}
//智能手机
public class SmartPhone extends Phone implements Photograph,Network,PlayWiring {


    @Override
    public void sendInfo() {
        System.out.println("发送带图片与文字的信息.....");
    }

    @Override
    public void call() {
        System.out.println("开始视频通话.....");
    }

    @Override
    public void info() {
        System.out.println("这是一款型号为HTC的I9100手机:");
    }

    @Override
    public void takePicture() {
        System.out.println("咔擦.....拍照成功");
    }

    @Override
    public void networkConn() {
        System.out.println("已经启动移动网络......");
    }

    @Override
    public void play(String content) {
        System.out.println("开始播放"+content+".....");
    }
}
//普通手机
public class OrdinaryMobilePhone extends Phone implements PlayWiring {


    @Override
    public void sendInfo() {
        System.out.println("发送文字信息......");
    }

    @Override
    public void call() {
        System.out.println("开始语音通话.......");
    }

    @Override
    public void info() {
        System.out.println("这是一款型号为G502c的索尼爱立信手机:");
    }

    @Override
    public void play(String content) {
        System.out.println("开始播放音乐"+content+"......");
    }
}

//测试类
public class TestPhone {
    public static void main(String[] args) {

        OrdinaryMobilePhone ord = new OrdinaryMobilePhone();
        ord.info();
        ord.play("热雪");
        ord.sendInfo();
        ord.call();
        System.out.println();
        SmartPhone sm = new SmartPhone();
        sm.info();
        sm.networkConn();
        sm.play("小时代");
        sm.takePicture();
        sm.sendInfo();
        sm.call();

    }
}

在这里插入图片描述

总结

  • 如果我们想拥有一些方法,并且有默认实现,就使用抽象类,但如果想实现多继承就要用接口。
  • 类是对事物的抽象,抽象类是对类的抽象,接口是对抽象类的抽象。
  • 接口用来抽象事物的特性,抽象类用于代码的复用。
  • 当我们的基本功能需要不断的改变时,用抽象类,反之用接口更加合适。
  • 抽象类就像一个继承的模板,方便我们知道它大概的模型,可以归纳子类的共性。
  • 接口就像一种功能或者能力,我们实现这个接口,我们就能够实现这个能力。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值