Java的接口和抽象类
1.抽象类
1.1 语法
抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰
抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。
[public] abstract class ClassName {
abstract void fun();
}
抽象类和普通类的主要有三点区别:
1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
2)抽象类不能用来创建对象;
3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
2.接口
2.1 语法
接口是对行为的抽象。
接口类和普通类的主要有三点区别:
1)接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),
2)方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法
[public] class ClassName implements Interface1,Interface2,[....]{
}
3.接口和抽象在设计层面的意义
抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。比如小鸟会飞,但是这个飞,不应该设计为一个事物类(抽象类),它只是一种行为。
3.1 接口
接口却是对类局部(行为)进行抽象。比如飞可以设计一个接口类,鸟可以去实现这个接口,飞机也可去实现这个接口,从而拥有飞的能力。
3.2 抽象
抽象类是对整个类整体进行抽象,包括属性、行为,比如鸟可以设计一个事物类(包含翅膀,羽毛,爪子,飞)。
3.3 应用场景
门可以分为有拥有火灾报警功能,没有火灾报警功能,但是它们都有共有功能就是,打开功能,关闭功能,请用类图和代码描述并解释为什么这么设计。
3.3.1 实现思路
象共有的行为,可以放到抽象类门中,当子类其它门继承这个抽象类,就都有了共有的行为。象特殊的行为,可以放到接口中,有需要就实现这个特殊行为接口,没有需求就可以不实现。实际上继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。
3.3.3 UML类图
3.3.3 实现场景
/**
* @author tbb
* 抽象类门
*/
public abstract class Door
{
/**
* 打开功能
*/
abstract void open();
/**
* 关闭功能
*/
abstract void close();
}
/**
* @author tbb
* 火灾报警接口类
*/
public interface FireAlarm
{
/**
* 火灾报警功能
*/
void alarm();
}
/**
* @author tbb
* 铝合金门
*/
public class AluminumDoor extends Door implements FireAlarm
{
@Override
public void open()
{
System.out.println("打开门");
}
@Override
public void close()
{
System.out.println("关闭门");
}
@Override
public void alarm()
{
System.out.println("火灾报警");
}
}
/**
* @author tbb
* 木门
*/
public class WoodenDoor extends Door{
@Override
public void open()
{
System.out.println("打开门");
}
@Override
public void close()
{
System.out.println("关闭门");
}
}