以前在学抽象类的时候,并没有深入了解一句话:为什么说含有抽象方法的类一定是抽象类,但是抽象类不一定含有抽象方法?今天就来讲讲
首先,抽象类不一定含有抽象方法
抽象类是指不能创建对象,不能能实例化的类,用abstract修饰就可以了,和方法没有直接关系。抽象类中可以没有抽象方法,如HttpServlet类。
抽象类和普通类的区别就在于,抽象类不能被实例化,就是不能被new出来,即使抽象类里面没有抽象方法。
抽象类的作用在于子类对其的继承和实现,也就是多态;
而没有抽象方法的抽象类的存在价值在于:实例化了没有意义,因为类已经定义好了,不能改变其中的方法体,但是实例化出来的对象却满足不了要求,只有继承并重写了他的子类才能满足要求。所以才把它定义为没有抽象方法的抽象类
其次,有抽象方法的一定是抽象类。
abstract class An{
abstract public void f();//没有方法体的方法叫做抽象方法,必须用abstract修饰,如果有抽象方法,该类一定是抽象类
// 注意这里的没有方法体的意思就是没有{}来实现,如果加了大括号就不能声明为抽象方法
// 这里的;也不能省的
}
abstract class Bn{
public void g (){
}
}
为什么需要抽象类?
抽象方法和抽象类看上去是多余的,对于抽象方法,不知道如何实现,定义一个空方法体不就行了吗,而抽象类不让创建对象,看上去只是增加了一个不必要的限制。
引入抽象方法和抽象类,是Java提供的一种语法工具,对于一些类和方法,引导使用者正确使用它们,减少被误用。
使用抽象方法,而非空方法体,子类就知道他必须要实现该方法,而不可能忽略。
使用抽象类,类的使用者创建对象的时候,就知道他必须要使用某个具体子类,而不可能误用不完整的父类。
无论是写程序,还是平时做任何别的事情的时候,每个人都可能会犯错,减少错误不能只依赖人的优秀素质,还需要一些机制,使得一个普通人都容易把事情做对,而难以把事情做错。抽象类就是Java提供的这样一种机制。
最后附上什么情况下需要重写方法,
1.单实现一个接口,必须重写接口中的方法(如果接口的方法和Object中的方法一样例外)(必须)
2.继承一个抽dao象类,必须重写抽象类中的抽象方法(如果抽象类中的方法和Object中的方法一样例外)(必须)
3.继承了一个父类,当父类的方法无法满足子类需要时,重写从父类继承过来的方法重写方法:
方法名必须一致,而且必须保证保证参数类型,参数个数和返回类型一样当然返回类型是对象类型时,重写方法返回类型可以是对象的子类类型重写的方法访问权限不能更小,
不能抛出更大的已检测异常,可以不抛(要注意:父类没有抛已检测异常,子类就不能抛或者只能抛运行时异常)