抽象类
抽象类定义:包含抽象方法的类。(当然也可以不包含抽象方法,但是如果不包含抽象方法的话,这普通类有什么区别?干嘛还要定义为抽象类嘛)。
先说一下抽象方法,抽象方法是一种特殊的方法,它只有声明,没有具体实现。如下;
package cn.ihep.abstractAndInterface;
public abstract class AbstractTest {
public abstract void eat();
}
abstract关键字用来修饰抽象方法或者抽象类,因为抽象类中有无具体实现的方法,所以不能用抽象类创建对象。
从上面也能看出,抽象类 就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么就等于白白创建了这个抽象类,因为单单一个抽象类不能用来做任何事情。
包含抽象方法的类称为抽象类,但不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和成员方法。注意,抽象类和普通类主要有三点区别:
- 抽象方法必须为public或protected,缺省情况下为public
- 抽象类不能用来创建对象
- 如果一个类继承与一个抽象类,则子类必须实现父类的抽象方法。如果子类没哟实现父类的抽象方法,则必须将子类也定义为抽象类。
其它方面,抽象类和普通类没有什么区别。
接口
接口中也可以有变量和 方法,但是,接口中的变量会被隐式的指定为public static final变量(并且只能是public static final变量,用private修饰会报错),而方法会被隐式的指定为public abstract方法且只能是public abstract方法(用其它关键字,如private、protected、static 、final等修饰会报编译错误),并且接口中所有方法不能有具体实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。
package cn.ihep.abstractAndInterface;
public interface InterfaceTest {
//默认就是public static final类型的变量
int count = 10;
public static final int count2 = 10;
//默认就是public abstract 的方法
int getCount();
public abstract int getCount2();
}
区别
从语法层面上看,
- 抽象类可以提供成员方法的具体实现,而接口只能存放public abstract方法
- 抽象类中的成员可以是各种类型的,而接口中的成员变量只能是public static final类型的
- 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码和静态方法
- 一个类只能继承一个抽象类,而一个类可以实现多个接口
从设计层面上看,
抽象类是对一个事物的抽象,即对类抽象,而接口是对行为抽象。
什么时候用抽象类和接口
- 如果你拥有一些方法并且想让它们中的一些有默认实现,那么请使用抽象类
- 如果你想多继承,那么必须使用接口。由于Java不支持多继承,子类不能继承多个类,但可以实现多个接口
- 如果不断改变(公共的)基本功能,那么就需要用抽象类
网友评论