使用关键字abstract定义的类叫做抽象类,在抽象类中可以包含抽象方法也可以不包含抽象方法,这意味着你在抽象类里边可以有具体的方法(有实现体)也可以有抽象方法(没有实现,没有括号,跟着分号)。抽象方法不能被实例化(不能创建抽象类的对象)
抽象类的声明:
在class前边加上abstract关键字,就使得这个类变成抽象类,看下边的代码:
// Declaration using abstract keyword
abstract class AbstractDemo{
// Concrete method: body and braces
public void myMethod(){
//Statements here
}
// Abstract method: without body and braces
abstract public void anotherMethod();
}
因为抽象类允许创建具体的方法,因此,它并不是100%的抽象,你可以说它是提供了部分的抽象,而接口提供的100%的抽象。
记住下边这两条规则:
1、如果一个类有很少的抽象方法和具体方法,那么就声明一个抽象类。
2、如果一个类只有抽象方法,那就就声明一个接口。
像我们之前讨论的,不能初始化一个抽象类,下边的代码抛出一个异常错误:
abstract public class AbstractDemo{
public void myMethod(){
System.out.println("Hello");
}
abstract public void anotherMethod();
}
public class ConcreteDemo{
public void anotherMethod() {
System.out.print("Abstract method");
}
public static void main(String args[])
{
//Can't create object of abstract class - error!
AbstractDemo obj = new AbstractDemo();
obj.display();
}
}
输出:
Unresolved compilation problem: Cannot instantiate the type AbstractEx1
注意:这个类继承自抽象类,就必须实现这个抽象类的抽象方法,否则,这个类也可以被声明为抽象类
为什么我们需要一个抽象类:
让我拿一个例子来说明这个问题,假设这里有一个Animal类,和一些其他类比如cat类、dog类、还有Horse类,这些类继承自Animal类,所以也就又很少的共同的习惯,现在你应该了解了那些上边那些类的用途,并且明白创建一个Animal类是没有什么意义的,因为你不能判断这个Animal类代表的是那个Animal,因此对于这种情况,我们创建一个抽象类然后再创建具体的类,然后相应的重写对应的方法,并且可以创建自己的方法。
抽象和具体的比较:
一个不是抽象类的类被称为是具体类,在上边的例子中,我说明了什么是Animal是抽象类,其他那三个是具体类。
关键的点是:
1、一个抽象类没有什么用,除非被其他的继承。
2、如果你在一个类里边定义了一个抽象方法,那么你也必须把这个类定义为抽象类,你不能在一个不是抽象类的类里边有抽象方法,翻过来却不一定是对的:一个类没有任何的抽象方法也可以被声明为抽象类、
3、抽象类可以没有抽象或者具体方法
好了,我们已经在上边讨论了一些抽象方法,下边我们来看一些简单的例子来更深的理解这个问题。
语法:
public abstract void display();
对于抽象方法,我们需要记住的一些关键点:
1、抽象方法没有实现体
2、声明使用冒号结束
3、它必须是能够被重写的,一个抽象类必须能够被继承,同样的抽象方法必须是能够被重写的。
4、抽象方法必须要在抽象类中
注意:继承自抽象类的类必须要实现或者是重写所有的抽象方法
抽象类和抽象方法的例子:
abstract class Demo1{
public void disp1(){
System.out.println("Concrete method of abstract class");
}
abstract public void disp2();
}
class Demo2 extends Demo1{
/* I have given the body to abstract method of Demo1 class
It is must if you don't declare abstract method of super class
compiler would throw an error*/
public void disp2()
{
System.out.println("I'm overriding abstract method");
}
public static void main(String args[]){
Demo2 obj = new Demo2();
obj.disp2();
}
}
输出:
I'm overriding abstract method