一、抽象类
抽象类是用来描述一种类型应该具备的基本特征和功能,具体如何去完成需要子类方法的重写来完成。
比如:人都有吃东西和走路两个行为,但具体怎么吃,如何走路,还要具体到某个人来说。
所以抽象方法只有方法的声明,没有方法体。有抽象方法的类一定是抽象类。
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、接口的特点
- 接口就是描述一种能力(比如运动员的跳远,跨栏,跳高,运动员如果要想跳高,就要去实现跳高这个接口,这样我才能承认你拥有这种能力)
- 如果一个类实现了一个接口中的所有方法,但没有提供方法体只有方法的标识,那么这个类一定是抽象类(所以抽象类和接口都能继承接口),注意:抽象方法只能存在于抽象类和接口中,但是抽象类中可以有普通方法,但是接口中百分比是抽象方法。
- java类库中接口的例子Comparator接口,这个接口代表具有能够比较这种能力,任何类只要继承了Comparator接口,就具备了比较这种能力,就可以进行排序了。
2、为什么要使用接口
- 接口可以用来解耦合,减低类之间的联系。
- 接口就是一种抽象,方便我们来实现
- 接口是一种实现多继承的方式。
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();
}
}
总结
- 如果我们想拥有一些方法,并且有默认实现,就使用抽象类,但如果想实现多继承就要用接口。
- 类是对事物的抽象,抽象类是对类的抽象,接口是对抽象类的抽象。
- 接口用来抽象事物的特性,抽象类用于代码的复用。
- 当我们的基本功能需要不断的改变时,用抽象类,反之用接口更加合适。
- 抽象类就像一个继承的模板,方便我们知道它大概的模型,可以归纳子类的共性。
- 接口就像一种功能或者能力,我们实现这个接口,我们就能够实现这个能力。