抽象类描述的是一个抽象的概念,这个类并没有包括足够的信息来描绘对象。比如动物类,只有动物的通用属性和行为描述等。
抽象类作为最基础的类,包含一些通用的基本成员属性和成员方法。在抽象类中甚至可以只给出方法的定义而不实现,具体实现由继承的子类来完成,这些方法也被称为抽象方法。
Java提供了abstract关键字来定义一个抽象类或抽象方法,定义格式如下:
[访问权限修饰符] abstract class[类名]
eg:
//抽象类Animal
abstract class Animal{
public String name;
public String color;
abstract void eat();
}
//子类Dog
class Dog extends Animal{
@Override//注解 重写父类方法
public void eat()
{
System.out.println("小狗爱吃骨头");
}
}
//子类Cat
class Cat extends Animal
{
@Override
public void eat()
{
System.out.println("小猫爱吃鱼");
}
}
public class Abstract{
public static void main(String[] args)
{
Animal cat = new Cat();
Animal dog = new Dog();
cat.eat();
dog.eat();
}
}
//子类必须重写父类的所有抽象方法,错误如下,没有重写eat方法
public class Dog extends Animal{
@Override
public void noteat{}
}
如果继承抽象类的子类也是抽象类,该子类可以不实现父类中的所有抽象方法。但是,该抽象子类的实现类必须实现抽象父类与子类的所有抽象方法。示例如下:
//抽象父类
abstract class ParentClass{
//抽象父类的抽象方法
public abstract void ParentMethod();
}
//抽象子类
abstract class ChildClass extends ParentClass{
//抽象子类的抽象方法
public abstract void ChildMethod();
}
//具体实现抽象类
class Person extends ChildClass
{
//重写父类的抽象方法
@Override
public void ParentMethod()
{
System.out.println("这是父类方法");
}
@Override
public void ChildMethod()
{
System.out.println("这是子类方法");
}
}
public class Abstract{
public static void main(String[] args)
{
Person person = new Person();
person.ParentMethod();
person.ChildMethod();
}
}
接口是一种更抽象的类,其定义的方法不允许实现方法(没有方法体,只是定义了方法入参,方法名和返回值类型),且没有任何与接口相关的存储。接口的子类也不称为继承,而是称为实现类。示例如下:
//注意,是用interface而不是class
interface AnimalService{
public void sleep();
}
//简单示例
//定义一个动物接口(AnimalService)
interface AnimalService{
public void sleep();
}
//注意,用implements而不是extends
class AnimalServiceImpl implements AnimalService{
@Override
public void sleep()
{
System.out.println("实现动物接口");
}
}
public class Abstract{
public static void main(String[] args)
{
AnimalService animalService = new AnimalServiceImpl();
animalService.sleep();
}
}
/*-------------------------------------------------------------*/
//多重继承,一个类同时实现多个接口
interface AnimalService{
public void sleep();
}
interface CatService{
public void playBall();
}
class Cat implements CatService,AnimalService{
@Override
public void sleep()
{
System.out.println("小猫睡觉");
}
@Override
public void playBall()
{
System.out.println("小猫玩球");
}
}
public class Abstract{
public static void main(String[] args)
{
Cat cat = new Cat();
cat.sleep();
cat.playBall();
}
}