1. 抽象类
父类中可以定义出一种行为,但无法描述这个行为的细节。具体的细节可以由各个子类去描述,这个时候父类的这个行为只需要给出定义,不需要进行描述。
体现在编程中,父类给出方法定义,子类去实现方法内部编码细节。
这种情况这个类可以理解为是一个抽象类,这种没有细节的方法被称为叫抽象方法。
抽象的关键字: abstract,它可以修饰类和方法
抽象类的定义
public abstract class AbstractTest {
public abstract void haha(); //haha方法给出定义,无需实现细节
public void xixi() {
System.out.println("嘻嘻");
}
}
抽象类中不一定有抽象方法
抽象类中允许出现普通方法
如果抽象方法要在类中定义,这个类一定是抽象类
抽象类不能直接创建对象
我们创建抽象类的目的就是为了作为父类使用
抽象父类:Bird
public abstract class Bird {
private String color;
public Bird(String color) {
this.color = color;
}
public void sleep() {
System.out.println("鸟类睡觉都是闭眼睛");
}
public abstract void eat();
}
实际子类:FlyBird
public class FlyBird extends Bird {
public FlyBird(String color) {
super(color);
}
@Override
public void eat() {
System.out.println("随便吃");
}
}
测试类
public class Test {
public static void main(String[] args) {
FlyBird fb = new FlyBird("");
fb.eat();
Bird b = new FlyBird("");
b.eat();
}
}
子类在继承了抽象父类后,必须对抽象方法进行实现。除非子类也是抽象类。
2. 接口
接口主要用于描述现实世界中拥有同种行为的事物。比如飞机,鸟,UFO...可能都会飞,但是是完全不同的类。
可以将接口理解为是一种特殊抽象类(没有属性只有抽象方法),实际上接口在官方文档的定义中不是类。
接口的特征:
- 关键字是interface,不是class
- 接口中定义的方法,全部都是公有抽象方法,可以省略public和abstract关键字。虽然省略,方法也被认为是公有抽象的
- 接口之间可以互相继承,且是多继承(extends)
- 类可以实现接口,且是多实现(implements)
接口一般命名为XXXXable,XXXX一般是一个动词,able在英文中表示“可能性”。XXXXable可以翻译为“有XXXX这个动作的可能性”
接口的声明
public interface Flyable {
public abstract void fly();
}
接口的继承,SwimAndFlyAble继承了 Swimable和Flyable接口中的方法,同时自己拓展了drink和run方法
public interface SwimAndFlyAble extends Swimable, Flyable {
public void drink();
public void run();
}
类实现接口
public class SuperBird implements SwimAndFlyAble {
@Override
public void swim() {}
@Override
public void fly() {}
@Override
public void drink() {}
@Override
public void run() {}
}
类既继承父类又实现接口,eat方法从bird中继承来的,fly方法从接口中实现来的
public class FlyBird extends Bird implements Flyable{
@Override
public void eat() {
System.out.println("随便吃");
}
@Override
public void fly() {
System.out.println("随便飞");
}
}
接口也可以作为上溯造型的多态使用,Swimable s表示可以在水上游泳的事物。SwimBird实现了Swimable 接口,Ship也实现了这个接口
public class Test2 {
public static void test(Swimable s) {
s.swim();
}
public static void main(String[] args) {
SwimBird s = new SwimBird("");
Ship p = new Ship();
test(s);
test(p);
}
}
总结:接口与类之间的关系,接口与接口之间的关系,类与类之间的关系
类 | 接口 | |
---|---|---|
类 | 单继承 | 多实现 |
接口 | X | 多继承 |
笔试面试题: 接口与抽象类的区别?
- 抽象类是class,接口是interface,不是一种东西
- 抽象类中可以有抽象方法,也可以有普通方法;接口中只能有抽象方法
- 抽象类中可以有属性;接口中也可以有属性,但接口中的属性必须是常量
- 抽象类只能被单继承,接口可以被多实现
网友评论