本节介绍抽象类和抽象方法.
什么是抽象类?
一个类如果没有足够的信息来描述,那么它就应该被设计成抽象类.
因此可以说抽象类就是一个有这么个功能,但不清楚要如何实现的这么一个类.
比如有一个动物类,动物都有吃的动作,但每一种动物吃的方式可能不同.这种情况下动物类就应该被设计成抽象类
抽象类如何定义?abstract关键字
如下,设置一个抽象类就是public abstract class 类名就可以了
public abstract class Animal {
public void eat(){}
}
申明成了抽象类就意味着这个类的功能不够明确,我们没有足够的信息来描述它,因此抽象类它不能被实例化.
public static void main(String[] args) {
Animal animal = new Animal() ;//这样会直接报错提示abstract类不能被实例化
}
所以我们就需要一个子类来实现它.比如我们创建一个鸟类继承动物类来实现这个吃的方法
public class Bird extends Animal{
@Override
public void eat() {//重写动物类的eat()方法
System.out.println("鸟啄着吃");
}
}
这样重写动物类的eat()方法,这是动物类的吃这个功能就被具体化了.有足够的信息来描述他了。因此这个时候就能实例化,但是要实例化实现了eat的那个类,也就是Bird
public static void main(String[] args) {
Animal animal = new Bird() ;
animal.eat();//这样就具体化了。
}
总结:
1,抽象类不能被实例化,它直接被继承
抽象方法
上面的例子说到了动物的吃是一种抽象的行为,因为每一种动物的吃法都可能不同.但是代码上并没有体现出吃是一种抽象行为
比如
public class Bird extends Animal{
@Override
public void eat() {
super.eat();//能调用animal类的eat(),说明了这个动物类的吃是具体的。
}
}
因此抽象类有一个特殊组成,就是抽象方法.上面的eat()方法就应该是抽象方法.
抽象方法就是一个不知道具体行为,但又确实存在的一个行为,如过一个方法是抽象方法,那它在代码中体现出来就是我们直接调用Animal类的eat()应该要报错,因为我们不知道Animal的eat()行为.
抽象方法如何写?
public abstract class Animal {
public abstract void eat();//abstract修饰,没有大括号,直接分号
}
就这么写,用abstract修饰,去掉{}直接写分号.此时上面的super.eat()就会报错.会提示无法直接调用抽象方法,因为它是抽象的,我们不知道它的具体行为(代码中的表现就是没有方法体)
再看以下代码
public class Bird extends Animal{}//报错,提示必须重写父类的抽象方法
子类继承了父类,但没有去重写它的抽象方法,那就说明这个子类同样也是没有办法具体描述的,那么它也必须是抽象类
public abstract class Bird extends Animal{}//编译通过
总结:
1,子类继承父类就必须重写父类的抽象方法,否则该类也必须声明为子类.
因为不这么做,你无法具体描述这个对象.
抽象类和抽象方法总结
1, 抽象类不能被实例化。只有抽象类的非抽象子类可以创建对象。
2. 抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类。
3.抽象类中的抽象方法没有方法体,就只是一个申明,需要子类继承并重写来实现它
4. 构造方法,static方法不能声明为抽象方法。
5, 子类继承抽象类,那么必须重写抽象类的抽象方法,否则该子类也必须申明为抽象类