为什么使用抽象类抽象方法
比如以下代码,chinese 用国粹输出,american用美国话输出,但是Person不知道用什么话输出,这里就可以把它变成抽象方法,声明为抽象类。
abstract class Person {
void speak() {
System.out.println("人在输出");
}
//speak方法变成抽象方法: abstract void speak();
}
class chinese extend Person{
@Override
void speak() {
System.out.println("中国人在用国粹输出");
}
}
class American extend Person{
@Override
void speak() {
System.out.println("美国人在用美国话输出");
}
}
抽象方法
- 抽象方法必须要被子类重写,
- 抽象方法,不能有方法体
- 抽象方法不能被 static,final,private 修饰
个人理解:
前面两条感觉没什么好说的,主要是最后一条。
先说 为什么不能被 static 修饰:我是这样理解的,因为 static 是依赖于类的,是这个类专属的。假如你可以在父类写一个 static 抽象类,子类也写一个同名的。它们的关系不是重写。相当于两个同名的方法,只不过隶属于两个不同的类,因为上面说过 static 是依赖于类的。
再说:为什么不能被 private 修饰:在父类如果有 private 方法,子类根本就看不到父类这个方法。不像 private 属性虽然继承下来了,但是隐藏了。这里要把属性和方法区分开。因为子类根本看不见,所以你在子类中再创建一个同名的方法,他也是和上面static 一样相当于两个同名的方法,只不过隶属于两个不同的类
最后:为什么不能被 final 修饰:final 就很好理解,final 修饰的类不能被重写,这里与 抽象类一定要重写相违背了。
抽象类
- 抽象类里面可以没有抽象方法
- 类中如果有抽象方法,那么这个类一定要声明为抽象类
- 抽象类不能被实例化
个人理解:
感觉只有第二条可以说点东西
为什么类中有抽象方法,这个类一定要声明为抽象类:因为如果不声明为抽象类,可以实例化对象,假如你给Person类不抽象,方法抽象,那Person到底抽不抽像,总感觉很怪。而且你Person类不抽象的话,你就可以实例化对象,你就可以调用抽象方法,而抽象方法,都没有方法体。这就很难搞了。所以类中有抽象方法,类一定要声明为抽象类
个人觉得要注意的点
- 子类要重写父类中所有抽象类
- 抽象类也是类,类该有的它都可以有
- 有抽象类 一定 要 声明为抽象方法; 而抽象类,不一定 要有抽象方法
大一牛马一只。水平有限,博客主要用来复习,以上知识如果有漏掉,或者错误的话,欢迎评论区留言,鞭打我