含有抽象方法的类被称为抽象类。它不能被直接实例化,一个抽象类必须用abstract关键字来修饰。
相应的,抽象类中没有方法体的方法被称为抽象方法。即抽象方法只需声明,无需实现。当然,一个抽象方法也必须用abstract来声明。
正是因为抽象类无法直接创建实例,所以在实际中,抽象类只是对某些具有相似性但又有一定区别的类型做成一个更高的抽象,
抽象类的特点:
(1)抽象类必须用abstract来修饰类的声明。
(2)抽象类不能直接用new运算符创建实例。
(3)抽象类中可以没有抽象方法,但如果定义了抽象方法,则该方法不能有方法体。
(4)抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。
abstract class Person
{
abstract void study();
void sleep()
{
System.out.println("立马睡觉");
}
}
class Student extends Person
{
void study()
{
System.out.println("学习了");
}
}
class Test
{
public static void main(String[] args)
{
new Student();
}
}
接口
接口是一组没有具体实现的方法的集合。任何一个类都可以实现接口中的一个或者多个方法。
接口和抽象类一样不能使用new运算符来创建一个实例。
可以使用实现的接口类型作为该类实例的类型。
接口和类是不一样的,类只能继承自一个父类,但接口却可以有多个父接口。
下面是一个实现了Comparable接口的Person类,使Person对象具有比较性。
class Person implements Comparable //该接口强制让学生具备比较性
{
private String name;
private int age;
Person(String name, int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public int compareTo(Object obj)
{
if(!(obj instanceof Person))
throw new RuntimeException("不是Person对象");
Person p = (Person)obj;
System.out.println(this.name+"--compareTo--"+p.name);
if(this.age==p.age)
return this.name.compareTo(p.name);
return this.age-p.age;
}
}
抽象类与接口的区别:
(1)一个类只能继承一个超类,但一个类实现多个接口,接口也可以多个父接口。
(2)接口中的方法仅是抽象方法的声明,而抽象类中可以包含方法的具体实现。