引言
public class Dog {
//叫
public void shout(){
System.out.println("汪汪汪汪汪");
}
}
public class Cat {
//叫
public void shout(){
System.out.println("喵喵喵喵喵喵");
}
}
public abstract class Animals {
//抽象方法
public abstract void shout();
}
1 抽象类的定义
在描述事物的时候,没有足够的信息描述这个事物(简单可理解为不能够明具体明确到方法内部代码体内容),那么这个事物就是抽象事物。被abstract修饰的类叫抽象类。被abstract修饰的方法叫抽象方法。如对狗、猫来说,动物就可以定义为抽象类。对苹果、香蕉来说,水果就可以定义为抽象类。
为什么要有抽象类?
面对的事物越多,操作起来就越复杂。继承更多的体现是在思想上,是去面对的共性类型,这样操作起来就更加简单。
2 抽象类的特点
(1)抽象类和抽象方法都需要被abstract 修饰,抽象方法必须要定义在抽象类中。
(2)抽象类不可以创建对象(实例化),因为抽象类描述的是抽象的事物,方法也不能具体化,调用方法无意义。
(3)一个非抽象类继承抽象类,必须将抽象类中所有的抽象方法进行重写,否则该子类还是一个抽象类(因为子类会继承父类的方法)。
(4)抽象类中可以没有抽象方法,但是抽象方法只能出现在抽象类中。
3 抽象类的细节问题
(1)抽象类一定是个父类吗?
是,因为我们是不断的向上抽取才抽取出来,抽象往往是具体事物的父类,抽象类被使用(继承)才有意义。另外抽象类也是一个类,其父类是object类。
(2)抽象类中是否存在构造方法?
有的。虽然抽象类本身不能创建对象,但是继承抽象的子类并重写所有的抽象方法之后子类是可以实例化的。在抽象类中,因为子类与父类是继承关系,当子类对象初始化的时候super()会调用父类构造方法,然后再完成对子类的初始化。所以,抽象类中是有构造函数的,作用是为了给子类对象初始化。
(3)抽象类中是否可以不定义抽象方法?
可以,如果这个类中没有抽象方法,但是却把这个类定义成了抽象类,目的是不让该类创建对象。
(4)抽象关键字不能够和哪些关键字共存?
1.final
2.private
3.static
4 抽象类和普通类的区别
相同:
(1)类都是用来描述事物的
(2)都可以定义属性和方法
不同:
(1)普通类可以创建对象,可以描述具体的事物
抽象类不可以创建对象,描述的事物信息不具体
(2)抽象类中可以多定义一个成员,抽象方法
普通类不可以定义抽象方法。
为什么要抽象类(接口)要这样定义一个什么都没有的抽象方法?这不是很麻烦吗?
这是一种编程思想,当代码大量繁琐较多时,我们就可以对某些功能进行抽取升华,需要什么功能我们直接调用就可以。